C#-WinForm跨線程修改UI界面的示例
背景
在我做WinForm開發(fā)的過程中,經(jīng)常會(huì)遇到耗時(shí)操作或阻塞操作。他們會(huì)引發(fā)軟件的卡頓甚至假死,嚴(yán)重影響軟件的使用。因此,這類耗時(shí)或阻塞的操作一般都會(huì)使用異步的方式去執(zhí)行,不影響主線程(UI線程)與用戶間的交互。但多個(gè)線程競(jìng)爭(zhēng)讀寫同一個(gè)資源往往會(huì)造成意想不到的意外結(jié)果,UI界面也是一種資源,所以跨線程修改UI界面往往被加以限制。而在Winform中,跨線程修改UI界面同樣是不被允許的。在子線程中修改界面控件時(shí)Visual Studio會(huì)報(bào)出如下錯(cuò)誤:
解決思路
.Net提供了很多跨線程修改UI的方法,每種方法也有與之對(duì)應(yīng)的工具類。我最常用的方法是ThreadPool+ delegate的方式完成跨線程對(duì)UI對(duì)的修改。
實(shí)例代碼
1、定義委托,把內(nèi)容寫在控件里面
private delegate void SetLabelDelegate(string value); private delegate void SetLabelDelegate2(string value); private void SetText(string value) { if (this.InvokeRequired) { SetLabelDelegate d = new SetLabelDelegate(SetText); this.Invoke(d, new object[] { value }); } else { txtbigcrmresult.Text = value.ToString() + txtbigcrmresult.Text; } }
2、定義方法,線程調(diào)用
private void button3_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test"); } private void dao(object url) { IDbConnection conn = new SqlConnection(txtbigcrmui.Text); SetText("\r\n" + "start"); ......................... SetText("\r\n" + "end"); }
3、更新ui控件
SetText("\r\n" + "start");
總結(jié)
1、使用delegate實(shí)現(xiàn)跨線程更新UI;
2、使用ThreadPool實(shí)現(xiàn)多線程執(zhí)行方法,避免卡頓;
以上就是C#-WinForm跨線程修改UI界面的示例的詳細(xì)內(nèi)容,更多關(guān)于C#-WinForm跨線程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 使用CancellationTokenSource取消多線程
有時(shí)間我們?cè)谑褂枚嗑€程的時(shí)候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來(lái)取消對(duì)Task開辟多線程的取消,感興趣的可以了解一下2021-08-08C#創(chuàng)建、部署、調(diào)用WebService圖文實(shí)例詳解
本文主要用詳細(xì)的圖文給大家介紹C#創(chuàng)建、部署、調(diào)用WebService的全部過程以及中間需要避免的問題。2017-11-11C#數(shù)據(jù)表格(DataGridView)控件的應(yīng)用案例
這篇文章主要介紹了C#數(shù)據(jù)表格(DataGridView)控件的應(yīng)用案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03