[英]Winform and threading (C#)
我對使用線程更新 UI 的 winform 應用程序有疑問。 我的應用程序確實從雲端上傳和下載文件。 同時我也在同一個 window 上顯示網絡速度詳細信息。這三個操作(上傳、下載、顯示 n/w 速度)由 3 個不同的線程調用。 問題是,當我開始下載/上傳時,整個 window 凍結並且 n/w 速度顯示不刷新(它被寫入每隔 1 秒刷新一次)。 會有什么問題? 提前致謝。
代碼如下...與我編寫的下載方式相同。 如果我先調用 **Upload** 然后調用 **Download**,第一個線程將暫停並開始下載線程。 **下載** 完成后,**上傳** 繼續。 它不是並行的。 此外,UI 不會立即響應其他按鈕單擊或 window 調整大小、移動操作。
public delegate void UploadDelgt();
UploadDelgt UpldDlgtObj;
private void Form1_Load(object sender, EventArgs e)
{
UpldDlgtObj = new UploadDelgt(DoUpload);
}
public void load()
{
Form1 form = this;
form.Invoke(UpldDlgtObj);
}
private void button1_Click(object sender, EventArgs e)
{
thrd = new Thread(new ThreadStart(load));
thrd.Start();
thrd.IsBackground = true;
}
public void DoUpload()
{
//uploads file block by block and updates the progressbar accordingly..
}
這三個操作(上傳、下載、顯示 n/w 速度)由 3 個不同的線程調用。 問題是,當我開始下載/上傳時,整個 window 凍結了
您的工作線程之一正在阻塞 UI 線程。 確保這些操作都沒有在 UI 線程上完成,並且您按照此處所述使用InvokeRequired
/ Invoke
: http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired
您的 UI 凍結是因為您在load
方法中調用form.Invoke
。 來自MSDN關於Invoke
: Executes the specified delegate on the thread that owns the control's underlying window handle.
因此,即使您在單獨的線程中調用DoUpload
,它仍會在 GUI 線程(擁有表單句柄)上執行,因為它是使用Invoke
的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.