winform跨線程更新ui C# winform多線程異步更新UI?
C# winform多線程異步更新UI?首先,在窗口上放置一個按鈕和一個圖片框(圖片框可見為假)。這個多線程的目的是點(diǎn)擊按鈕,圖片就會正常運(yùn)行。另一個線程將在休眠10秒后執(zhí)行。private void
C# winform多線程異步更新UI?
首先,在窗口上放置一個按鈕和一個圖片框(圖片框可見為假)。這個多線程的目的是點(diǎn)擊按鈕,圖片就會正常運(yùn)行。另一個線程將在休眠10秒后執(zhí)行。
private void button1_uu1;Click(object sender,EventArgs E)
{
//啟動線程系統(tǒng)線程線程=新系統(tǒng)線程(新建)System.Threading.ThreadStart( 這個。結(jié)果))
pictureBox1.Visible=true
按鈕1.Enabled=false線程。開始()
}
私有void Result()
{
bool好的=這個。你知道嗎()
這個。開始喚醒(新建)System.Threading.ThreadStart(delegate()
{
if(確定)MessageBox.顯示(“success”、“prompt”
否則MessageBox.顯示(“fail”,“prompt”)。可見=假
按鈕1。Enabled=true
}
!]private bool do()
{系統(tǒng)線程.Sleep(10000)
return True
winform更新UI控件的時間過長導(dǎo)致假死?
您可以使用多線程,并委派創(chuàng)建控件的線程來更新控件。
如果(datagridview1。InvokeRequired){//確定當(dāng)前線程是否必須調(diào)用invoke來更新控件datagridview1。Invoke(new action(()=>{//委托創(chuàng)建控件的線程來更新控件datagridview1。背景顏色=顏色:黑色//更新控件操作})}
非UI線程無法更改UI控件內(nèi)容(由于安全限制)。
因此,當(dāng)您想用子線程(非UI線程)更改UI控件的內(nèi)容時,必須使用委托(您想做的),然后讓控件執(zhí)行委托本身。所以很安全。
C#為什么多線程控制winform需要用委托?
有兩種簡單的方法可以解決此問題。
1. 使用多線程,把ckbind處理放到子線程中,它不會影響主窗口對系統(tǒng)事件的響應(yīng),它也不會沒有響應(yīng),如果你想的話,你也可以使主窗口不可用,然后添加一個進(jìn)度條,讓人們知道一個長進(jìn)程正在執(zhí)行,程序還在運(yùn)行。
2. 在ckbind中,如果循環(huán)引起的事件太長,則可以在循環(huán)有固定次數(shù)時調(diào)用它應(yīng)用程序.DoEvent()方法使程序能夠?qū)ο到y(tǒng)事件響應(yīng)一次。雖然不能看到程序移動,但它不會沒有響應(yīng)。因為系統(tǒng)判斷無響應(yīng)是指程序在一定時間內(nèi)無法對系統(tǒng)事件做出響應(yīng),所以在此時間之前它只響應(yīng)一次,就不存在響應(yīng)問題。