【发布时间】:2013-09-27 10:26:58
【问题描述】:
我正在开发基于 NET 3.5 构建的遗留应用程序。这是我无法改变的约束。 我需要执行第二个线程来运行长时间运行的任务而不锁定 UI。当线程完成后,不知何故我需要执行一个回调。
现在我尝试了这个伪代码:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
_thread.Join();
// execute finalizer
不锁定 UI 的第二个选项如下:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
while(_thread.IsAlive)
{
Application.DoEvents();
Thread.Sleep(100);
}
// execute finalizer
当然,第二种解决方案不好,因为它会使 UI 过度充电。 _thread 完成时执行回调的正确方法是什么?另外,我怎么知道线程是被取消还是中止?
*注意:* 我不能使用 BackgroundWorker 也不能使用 Async 库,我需要使用原生线程类。
【问题讨论】:
-
Thread.Start(object) 可以接受用户参数。该参数可以用作状态。您是否考虑过将回调(或者甚至是复杂类型,如果需要)作为参数传递?
-
你能告诉为什么不能使用BackgroundWorker吗?我只能想到几个案例,细节实际上可能很重要。
-
我无法使用后台工作程序,因为我无法向 Windows Form .dll 添加依赖项,因为异步工作程序也适用于非 UI 应用程序
标签: c# multithreading