C#.NET中的异步回调

来源:百度知道 编辑:UC知道 时间:2024/06/05 10:47:59
在看书时看到

“如果需要将一些额外的信息传送给回调函数,就将其放入BeginInvoke()方法的第3个参数asyncstate中,注意到这个参数的类型为Object,所以可以防止任意类型的数据。
如果有多个信息需要传送给回调函数,可以将所有要传送的信息封装到一个struct或者再定义一个类,将信息封装到这个类所创建的对象中,再传送给begininvoke()方法。”
我不清楚的是第二段,我尝试着做了一下,但是回调的函数的传入参数只能够是IAsyncResult类型的,如果用类的话begininvoke() 中的第二个参数不能够写那个以类或结构为参数的函数,只能够写用IAsyncResult类型的参数的函数。。。。可能我没有搞懂,请大家帮帮忙啦
BeginInvoke()第三个参数是放回调函数的参数的,第二个是放回调的那个函数,但是我放的时候必须得是只有IAsyncResult类型参数的函数。。。。

如果你是使用委托进行异步编程的话:
首先你要定义一个委托,该委托于你需要异步执行的方法的签名一定要一样,
另外 在定义委托时,还可以加上两个可选的参数
意思就是说
你的方法签名 public string TestMethod(int i)
你的委托这样 public delegate string AsyncMethod(int i);
在程序里面,你可以这样用
实例化你的委托:
// ad.TestMethod 假设TestMethod方法包含在一个ad的对象中
AsyncMethod caller = new AsyncMethod(ad.TestMethod);
IAsyncResult Result = caller.BeginInvoke(1,null/*回调*/,new StateObject() /*StateObject是你的对象*/);

这个你调用会返回IAsyncResult 对象 在上面 就是Result
你可以这样获得你的对象
Result.AsyncState 但是必须强制转换。

你可以在MSDN中看一下

"我不清楚的是第二段,我尝试着做了一下,但是回调的函数的传入参数只能够是IAsyncResult类型的"

iasyncresult 是begininvoke的返回值.这个接口被waihandle实现了.算是他的父类.

异步调用的时候,传给那个线程的参数,是object类型的.所以可以自己封装成类.

begininvoke我没用过这个函数,不过你的问题,差阅msdn就可以解决.我做程序一般不用异步,我都用线程.有什么不明白的再问我.

第一段不是说的是第三个参数吗,楼主你怎么用第二个参数了。