0

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

代码如下......我写的下载方式相同。如果我先调用 **Upload** 然后 **Download** 一个接一个,第一个线程将暂停并开始下载线程。**下载**完成后,**上传**继续。它不会并行。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..
}
4

2 回答 2

2

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

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

于 2012-04-04T10:15:49.693 回答
1

您的 UI 冻结,因为您正在调用form.Invoke您的load方法。来自MSDN的关于InvokeExecutes the specified delegate on the thread that owns the control's underlying window handle. 所以,以为您是DoUpload在单独的线程中调用,它仍然在 GUI 线程(拥有表单句柄)上执行,因为它是用Invoke.

于 2012-04-05T12:16:58.927 回答