您的位置:首页 > 编程语言 > C#

C#中异步及winform中界面假死

2016-01-01 21:35 267 查看
c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke。

主要区别是controller的BeginInvoke会返回到主线程中执行。如果在Winform中使用了controller得BeginInvoke去执行一些费时的操作任然会使界面假死。

controller的BeginInvoke使用方法是先定义一个委托 如

delegate void UpdateUI(string s);然后生成一个实例

UpdateUI mi = new UpdateUI(DoUpdate); DoUpdate就是要执行的具体函数返回值和参数要和定义的委托一致.

this.BeginInvoke(mi,new object[]{s}) 这里的s就是要传递的参数

委托的BeginInvoke会产生一个线程去处理这样就不会讲界面卡住但是在调用EndInvoke时如果操作没有完成依然会卡住界面,为了解决这个问题使用回调函数在调用结束时自动调用回调函数

使用方法也是先定义委托并实例化以上面的例子然后是

IAsyncResult result = mi.BeginInvoke(s,new AsyncCallback(method),mi)

method函数就是结束调用的回调函数最后一个参数是传递给回调函数的参数这里传递委托自己本身

在method函数中要调用EndInvoke即使回调函数什么事也不做也要调用

void method(IAsyncResult result)

{

UpdateUI ui = (UpdateUI)result.AsyncState;

ui.EndInvoke(result);

}

在处理逻辑是可以讲一些复杂的逻辑放在委托的异步简单可以直接使用controller的异步这样也不会造成界面的卡死。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: