处理不Wait()的Task异常的最佳方法是什么?我读了几篇关于使用ContinueWith的博客,因为常规的try / catch无法处理Task异常。下面的代码不会验证。
方法1:
public class Service1 : IService1
{
public string GetData(int value)
{
var a = Task.Factory.StartNew(ThrowException);
return string.Format("You entered: {0}", value);
}
private void ThrowException()
{
try
{
Thread.Sleep(6000);
throw new ArgumentException("Hello from exception");
}
catch (Exception)
{
Trace.WriteLine("Log it");
}
}
}
方法2:
public class Service1 : IService1
{
public string GetData(int value)
{
var a = Task.Factory.StartNew(ThrowException);
a.ContinueWith(c => { Trace.WriteLine("Log it"); },
TaskContinuationOptions.OnlyOnFaulted);
return string.Format("You entered: {0}", value);
}
private void ThrowException()
{
Thread.Sleep(6000);
throw new ArgumentException("Hello from exception");
}
}
方法1和方法2是否做同样的事情?有没有更好的方法来实现它。
编辑:添加了代码片段以继续。
答案 0 :(得分:2)
这两种方法都有效,它们是等效的。选择你最喜欢的。基于continuation的优点是您可以将错误处理转换为扩展方法(或其他一些中央帮助程序)。
您是否知道IIS工作进程可能会因多种原因突然消失?在那种情况下,背景工作就会丢失。或者,工作失败但错误处理程序消失。
答案 1 :(得分:1)
如果你需要的只是在Trace类上调用方法,它看起来会起作用。但是,如果您需要自定义异常处理,我建议您注入异常处理程序:
private void ThrowException(Action<Exception> handleExceptionDelegate)
{
try
{
// do stuff that may throw an exception
}
catch (Exception ex)
{
if (handler != null)
handleExceptionDelegate(ex);
}
}
然后你可以做
Task.Factory.StartNew(() =>
{
ThrowException((ex) =>
{
// Handle Exception
});
});