我想在后台线程上执行一些长时间运行的操作(例如监听操作系统引发的一些事件)。大多数情况下,操作会连续运行而不会出现任何问题。但是在某些罕见的情况下,操作系统级别的 API 会发送一些错误代码,我需要从后台线程引发异常,该异常必须传播到主线程以将其显示给我的WinFrom
应用程序的用户。
我决定用BackgroundWorker
这个。但是根据 TPL 上的各种博客,.NET 4.0 提供Task
了一个更好的选择。Task Parallel Library
在我的应用程序中,我必须在显示实际表单之前启动后台任务。由于实际代码相当复杂,我编写了一些模拟实时问题的示例代码:
public static Task task;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ThreadTest tt = new ThreadTest();
task = new Task(() => tt.PerformTask("hi"));
task.Start();
try
{
task.Wait();
}
catch (AggregateException aggregateException)
{
// Handle exception here.
}
Application.Run(new Form1());
}
在这段代码中,我从来没有看到主窗体,因为后台任务一直在无异常运行,并且task.Wait()
调用使当前线程等待后台任务完成!
我是否可以将TPL
'sTask
用于主线程不应该等到后台任务完成但同时在后台任务引发异常时获取异常详细信息的情况?
在上面的代码中,解决方案之一可能是在稍后阶段移动任务创建代码。但在这种情况下,我的问题更具学术性。