我想在后台线程上执行一些长时间运行的操作(例如监听OS引发的某些事件)。大多数情况下,操作将持续运行,没有任何问题。但在某些罕见的情况下,操作系统级别的API会发送一些错误代码,并且我需要从后台线程中引发异常,并将其传播到主线程以显示给我的WinFrom
应用程序的用户。如何获得从长时间运行的后台引发的异常没有主线程等待的任务
我决定使用BackgroundWorker
这个。但是.NET 4.0提供Task
类的Task Parallel Library
这是TPL上各种博客的更好选择。
在我的应用程序中,我必须在显示实际窗体之前启动后台任务。由于实际的代码是相当复杂的,我已经写了一些示例代码模拟真实时间的问题:
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
的Task
这样的场景中主线程不应该等到后台任务已完成,但在同一时间,它应该得到异常的详细信息异常时从后台任务提出的?
在上面的代码中,解决方案之一可能是在稍后阶段移动任务创建代码。但在这种情况下,我的问题更具学术性。
这确实是非常有帮助的。谢谢你。 但是,在您的代码中,异常不会传播到“主”线程。它传播到启动任务的线程。如果我们需要显示模态MessageBox,那么主模板必须作为模态MessageBox的所有者传递,这会产生问题。不是吗? – Learner
查看我编辑的程序代码版本 –
太棒了!为我工作。 :) – Learner