【发布时间】:2013-01-21 16:34:21
【问题描述】:
我在使用Task.Factory.StartNew 并尝试捕获抛出的exception 时遇到问题。在我的应用程序中,我有一个长时间运行的任务,我想将其封装在 Task.Factory.StartNew(.., TaskCreationOptions.LongRunning); 中
但是,当我使用Task.Factory.StartNew 时,没有捕获到异常。然而,当我使用Task.Run 时,它可以正常工作,我认为这只是Task.Factory.StartNew 的一个包装器(例如根据this MSDN article)。
此处提供了一个工作示例,不同之处在于使用Task.Run 时会将异常写入控制台,而使用Factory.StartNew 时则不会。
我的问题是:
如果我有一个可能引发异常的LongRunning 任务,我应该如何在调用代码中处理它们?
private static void Main(string[] args)
{
Task<bool> t = RunLongTask();
t.Wait();
Console.WriteLine(t.Result);
Console.ReadKey();
}
private async static Task<bool> RunLongTask()
{
try
{
await RunTaskAsync();
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
Console.WriteLine("success");
return true;
}
private static Task RunTaskAsync()
{
//return Task.Run(async () =>
// {
// throw new Exception("my exception");
// });
return Task.Factory.StartNew(
async () =>
{
throw new Exception("my exception");
});
}
【问题讨论】:
-
如果你执行 Task.Factory.StartNew(someAction, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default) 会发生什么 - 你得到相同的结果吗?
-
@MatthewWatson 是的,不幸的是同样的结果
-
另外,请参见此处:blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx(接近末尾的一位 cmets 提出了类似的问题)
-
@MatthewWatson 我看不出是哪条评论。来自
nick的评论似乎只处理await Task.Run(() => ..和await Task.Run(async () => ..之间的区别 -
嗯,是的,我假设异步的事情与它有关。也许不是!
标签: c# exception task-parallel-library taskfactory