在UI线程上运行长流程并仍然更新UI以报告进度

时间:2011-01-20 21:20:46

标签: c# multithreading user-interface main

我有C#应用程序,必须处理长时间的工作。我有一些限制,因为我无法承担在后台线程中运行那么长的工作,例如我正在使用的一些com对象不能在后台线程中使用。如何在UI线程中处理这个长作业,并使用进度报告更新UI。

可以做些什么来在处理大工作时让UI响应?

提前致谢,

Bibek Dawadi

2 个答案:

答案 0 :(得分:2)

您可以使用后台线程中的COM对象。只需确保后台线程也是STA线程。 (假设:COM对象本身就是一个STA对象)。

在Vista Aero及更高版本中,如果您没有足够快地绘制窗口,Windows将做出奇怪的决定。就像它一样,它将开始显示窗口内容的旧版本。如果您的窗口没有响应一秒或两秒的绘制消息,这将启动。

答案 1 :(得分:0)

如果该作业不是一个大阻塞调用,并且您正在使用WinForms,则可以在长时间运行的操作中调用Application.DoEvents()。每次调用它时,UI都会更新(所有待处理的窗口消息都将被处理),因此请按照您希望UI响应的方式进行调用。