没有Wait()的任务上的异常处理

时间:2015-01-22 19:16:32

标签: wcf exception-handling task-parallel-library

处理不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是否做同样的事情?有没有更好的方法来实现它。

编辑:添加了代码片段以继续。

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
    });
});