没有 Wait() 的任务的异常处理
Exception handling on Tasks without Wait()
处理没有 Wait() 的任务异常的最佳方法是什么?我读了一些关于使用 ContinueWith 的博客,因为常规 try/catch 无法处理任务异常。下面的代码没有验证这一点。
方法一:
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");
}
}
}
方法二:
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");
}
}
方法一和方法二做的是同一件事吗?有没有更好的方法来实现这个。
编辑:为 continuewith 添加了代码片段。
如果您只需要在 Trace class 上调用方法,它看起来会起作用。但是,如果您需要自定义异常处理,我建议注入一个异常处理程序:
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
});
});
这两种方法都有效,而且它们是等价的。选择你最喜欢的。基于延续的方法的优点是您可以将错误处理放入扩展方法(或其他中央助手)中。
您是否知道 IIS 工作进程可能由于多种原因突然消失?在这种情况下,后台工作将丢失。或者,工作出错但错误处理程序消失。
处理没有 Wait() 的任务异常的最佳方法是什么?我读了一些关于使用 ContinueWith 的博客,因为常规 try/catch 无法处理任务异常。下面的代码没有验证这一点。
方法一:
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");
}
}
}
方法二:
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");
}
}
方法一和方法二做的是同一件事吗?有没有更好的方法来实现这个。
编辑:为 continuewith 添加了代码片段。
如果您只需要在 Trace class 上调用方法,它看起来会起作用。但是,如果您需要自定义异常处理,我建议注入一个异常处理程序:
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
});
});
这两种方法都有效,而且它们是等价的。选择你最喜欢的。基于延续的方法的优点是您可以将错误处理放入扩展方法(或其他中央助手)中。
您是否知道 IIS 工作进程可能由于多种原因突然消失?在这种情况下,后台工作将丢失。或者,工作出错但错误处理程序消失。