【发布时间】:2015-11-24 05:53:28
【问题描述】:
我想在主 UI 线程上做一些工作时显示一个带有进度条的模式对话框。如果不使用任何多线程技术,我的 UI 肯定会处于挂起状态。
如何在主线程上运行计算密集型长操作时实现这一点(因为它涉及 UI 元素,我不寒而栗地触摸这个遗留代码),同时在等待窗口上显示计算状态(应该运行在不同的线程上)
我需要在另一个线程上运行一个进度对话框窗口,同时保持主线程被占用来计算涉及主 UI 表单元素的长绑定操作。
感谢指点
【问题讨论】:
-
您不在主线程上运行 cpu 绑定操作。您在 BackgroundWorker 上运行它们。此外,模态对话框(等待窗口)通常在主(UI)线程上运行,因为它通常由在主(UI)线程中执行的语句创建。因此,启动一个后台工作程序,附加到 DoWork 事件并在事件处理程序中实现您的长时间运行的任务。启动后,您可以立即显示模态窗口。
-
你也应该让你的进度/等待窗口modeless,以防你想添加一个Cancel按钮。想想资源管理器中的 Windows 文件复制窗口。然后你可以取消
BackgroundWorker -
如果你可以在 .NET 4.5+ 中使用
async和await以及Task.Run,这将更容易。正如其他人所指出的那样,您需要在后台线程上进行工作以防止 UI 结霜,但您不需要求助于后台工作人员。 -
另外,看看
System.Progress<T>类型。 -
非常感谢大家的建议。我将尝试实现它并返回
标签: c# multithreading asynchronous