介绍背景
解决思路
实例代码
这篇文章给大家介绍怎么在c#中利用WinForm上实现一个跨线程修改UI界面的功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
背景
在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在WinForm中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:
解决思路
。净提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是ThreadPool +委托的方式完成跨线程对UI对的修改。
实例代码
1,定义委托,把内容写在控件里面
private delegate void SetLabelDelegate (string 价值); ,,,private delegate void SetLabelDelegate2 (string 价值); ,,,private void SetText (string 价值) ,,,{ ,,,,,if (this.InvokeRequired) ,,,,,{ ,,,,,,,SetLabelDelegate d =, new SetLabelDelegate SetText (); ,,,,,,,this.Invoke (d, new 对象[],{,value }); ,,,,,} ,,,,, ,,,,,{ ,,,,,,,txtbigcrmresult.Text =, value.ToString (), +, txtbigcrmresult.Text; ,,,,,} ,,,}
2,定义方法,线程调用
private void button3_Click (object ,发送方,EventArgs e) ,,,{ ,,,,,ThreadPool.QueueUserWorkItem (new WaitCallback (dao),“test"); ,,,} ,private void 刀(object url) ,,,{ ,,,,,IDbConnection conn =, new SqlConnection (txtbigcrmui.Text); ,,,,,SetText (“\ r \ n", +,“时); ,,,......................... ,,,,,SetText (“\ r \ n", +,“以何种;); ,,,}
3,更新ui控件
, SetText (“\ r \ n", +,“时),
关于怎么在c#中利用WinForm上实现一个跨线程修改ui界面的功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。