没有 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 工作进程可能由于多种原因突然消失?在这种情况下,后台工作将丢失。或者,工作出错但错误处理程序消失。