使用try catch围绕某个任务调用的函数块和在task.wait()上调用try / catch之间的区别是什么。如果我处理函数中的异常,我仍然需要担心task.wait()可能发生的任何异常吗?
var factory = new TaskFactory();
task t1= factory.StartNew(() => funA();
t1.Wait();
void funcA()
{
try{..}
.
.
catch{..}
}
或者
var factory = new TaskFactory();
task t1= factory.StartNew(() => funA();
try
{
t1.Wait();
}
catch{....}
void funcA()
{
}
答案 0 :(得分:1)
使用您提供的第一个块,您将无法捕获可能发生的任何异常:
ObjectDisposedException
:任务已经处理完毕。
ArgumentOutOfRangeException
:timeout是-1毫秒以外的负数,表示无限超时 - 或 - 超时大于MaxValue。
AggregateException
:任务被取消 - 或者 - 在执行任务期间抛出了异常。
答案 1 :(得分:0)
我用来处理具有延续的任务中的异常,更容易IMO:
Task myTask= Task.Factory.StartNew( ... ).ContinueWith(myTaskFinished=>
{
if (myTaskFinished.IsCompleted)
{
// Hooray
}
if (myTaskFinished.IsFaulted)
{
foreach (Exception ex in myTaskFinished.Exception.InnerExceptions)
//Exception handle..
}
if(myTaskFinished.IsCanceled)
{
//Cancellation token?
}
});
myTask.Wait();