Winform和线程(C#)

时间:2012-04-04 10:12:15

标签: c# winforms multithreading

我遇到winform应用程序的问题,它使用线程来更新UI。我的应用程序确实从云上载和下载文件。同时我也在同一个窗口显示网络速度详细信息。这3个操作(上传,下载,显示n / w速度)由3个不同的线程调用。问题是,当我开始下载/上传时,整个窗口冻结并且n / w速度显示不刷新(它被写入每隔1秒间隔刷新一次)。会有什么问题?提前谢谢。

代码如下......我写的下载方式相同。如果我先调用**上传**然后**一个接一个地**下载**,第一个线程将暂停并下载线程启动。一旦**下载**完成然后**上传**继续。它不是平行的。此外,UI不会立即响应其他按钮单击或窗口大小调整,移动操作。

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..
}

2 个答案:

答案 0 :(得分:2)

  

这三个操作(上传,下载,显示n / w速度)由3个不同的线程调用。问题是,当我开始下载/上传时,整个窗口冻结

您的一个工作线程正在阻止UI线程。确保这些操作都不在UI线程上完成,并且您使用InvokeRequired / Invoke,如下所述:http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired

答案 1 :(得分:1)

您的用户界面冻结是因为您在form.Invoke方法中呼叫load。来自MSDNInvokeExecutes the specified delegate on the thread that owns the control's underlying window handle. 因此,如果您在一个单独的线程中调用DoUpload,它仍然在GUI线程(拥有表单句柄)上执行,因为它是使用Invoke调用的。