我遇到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..
}
答案 0 :(得分:2)
这三个操作(上传,下载,显示n / w速度)由3个不同的线程调用。问题是,当我开始下载/上传时,整个窗口冻结
您的一个工作线程正在阻止UI线程。确保这些操作都不在UI线程上完成,并且您使用InvokeRequired
/ Invoke
,如下所述:http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired
答案 1 :(得分:1)
您的用户界面冻结是因为您在form.Invoke
方法中呼叫load
。来自MSDN约Invoke
:Executes the specified delegate on the thread that owns the control's underlying window handle.
因此,如果您在一个单独的线程中调用DoUpload
,它仍然在GUI线程(拥有表单句柄)上执行,因为它是使用Invoke
调用的。