【发布时间】:2016-11-07 17:31:36
【问题描述】:
使用任务时,如果我不调用等待我的任务,我不确定如何处理。下面的例子不是在异步方法中执行的。
这是一个例子:
var t = Task.Run(() =>
{
// do something as part of the task concurrently
});
将整个块包裹在上面并捕获异常是正确的方式吗?
我知道我可以等待下面的任务结果并处理异常,但我的问题与上面的块有关,无需调用 t.Wait。
try
{
t.Wait();
}
catch(AggregateException ae)
{
// handle exception(s)
}
所以,我的问题是,当我不等待(或等待)任务时,这是否是处理异常的正确方法?
try
{
var t = Task.Run(() =>
{
// do something as part of the task concurrently
});
}
catch(Exception ex) //NOTE general Exception
{
// show exception in message box or log it somewhere
}
更新1 ,还是我应该这样做?
var t = Task.Run(
() =>
{
try
{
// do something as part of the task concurrently
}
catch(Exception ex) //NOTE general Exception
{
// show exception in message box or log it somewhere
}
});
【问题讨论】:
-
不要选择你的单词选择,“//异步做某事作为任务的一部分”应该是“//做某事作为任务的一部分同时”。使用
Task.Run不会使某些东西异步,您需要 API 支持才能真正异步。 -
到您的最新更新,不,它不正确。想一想,如果您不等待
t并且需要“10 行代码的时间”来抛出异常,那么您现在就退出了 try 块。 -
回复:更新 1 - 当然可以。这意味着您的错误处理在任务内部,这意味着它不知道是任务或任务运行的上下文。如果这就是你所追求的,那就去吧。这与任何其他方法中的异常处理没有什么不同。
-
然后回答这个问题 - 所有方法都应该处理自己的异常,还是应该向调用者抛出异常。如果是后者,您需要以下答案中的解决方案之一。l
-
你的 update1 也是错误的,尝试需要在
() =>之后而不是之前。
标签: c# exception-handling task