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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Chrome下载无后缀问题
    duilib程序HelloWorld
    go的windows下的安装包
    ASP.NET MVC异步上传图片和富文本编辑器的使用详解
    搭建go环境(windows和linux)
    构建离线Go编程指南——gotour
    判定模块加载时是否存在循环依赖
    Winform开发框架之框架演化
    为什么要写技术博
    JTREE使用例子—创建一个客户端界面
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829685.html
Copyright © 2011-2022 走看看