c#Invoke加Join()为什么会一加死机怎么办?

让我们首先了解下什么时候用到C#異步调用:

.NET Framework 允许您C#异步调用任何方法定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名嘚BeginInvoke 和EndInvoke 方法。

BeginInvoke 方法用于启动C#异步调用它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)BeginInvoke 立即返囙,不等待C#异步调用完成BeginInvoke 返回IasyncResult,可用于监视调用进度

}


  
之前有被面试官问过在WinForm中,要去网络上获取数据由于网络环境等原因,不能很快的完成因此会发生进程阻塞,造成主进程假死的现象需要怎么解决?

  因此往往是新建一个线程,让他执行耗时的操作主线程管理用户界面,不会出现UI假死的情况但是通过线程获取到的数据如何更新回主進程的UI上呢?这是另外一个问题
  
我们发现如果直接在线程里更新UI会报错报“从不是创建控件lable1的线程访问它”,为什么会报这个错呢这个问题就是跨线程访问控件问题,窗体上的控件只允许创建它们的线程访问也就是主线程(UI线程),如果非主线程访问则会发生异常我們看到会报错且这个错误是“从不是创建控件lable1的线程访问它”

26 //在testclass对象的mainThread(委托)对象上搭载两个方法,在线程中调用mainThread对象时相当于调用了这兩个方法 32 //启动线程,启动之后线程才开始执行 37 /// 在界面上更新线程执行次数 42 //判断该方法是否被主线程调用也就是创建labMessage1控件的线程,当控件的InvokeRequired属性为ture时说明是被主线程以外的线程调用。如果不加判断会造成异常 49 //this指窗体,在这调用窗体的Invoke方法也就是用窗体的创建线程来執行mainThread对象委托的方法,再加上需要的参数(i) 60 /// 在界面上更新线程执行次数 72 //this指窗体在这调用窗体的Invoke方法,也就是用窗体的创建线程来执行mainThread对象委托的方法再加上需要的参数(i)

}

一直对invoke和begininvoke的使用和概念比较混乱这两天看了些资料,对这两个的用法和原理有了些新的认识和理解

}

我要回帖

更多关于 一加死机怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信