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

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的异步这样也不会造成界面的卡死。
---------------------
作者:zhizhuode
来源:CSDN
原文:https://blog.csdn.net/zhizhuode/article/details/50445945
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/asdyzh/p/9829685.html