zoukankan      html  css  js  c++  java
  • 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
    单例模式
    JDBC连接数据库查询信息的步骤(提取成配置文件方式)
    JDBC访问数据库查询信息的步骤(硬编码格式)
    大数据
    accp
    递归
    struts2中Action到底是什么,怎么理解
    转发和重定向的区别(简单解释)
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829685.html
Copyright © 2011-2022 走看看