簡體   English   中英

Winform 和線程 (C#)

[英]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 / Invokehttp://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired

您的 UI 凍結是因為您在load方法中調用form.Invoke 來自MSDN關於InvokeExecutes 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM