我应该如何处理AsyncCodeActivity中的异常?

时间:2012-08-16 11:24:08

标签: workflow-foundation-4

我遇到了一个未在我的工作流程中捕获的异常的问题。 我有一个由TryCatch包围的自定义AsyncCodeActivity;无论如何,异常没有被捕获,更糟糕的是,托管工作流的IIS池有时会重新启动。 看看这个问题/答案(Exception escapes from workflow despite TryCatch activity),我认为问题在于我重新抛出异常。这就是我经常编写异步代码活动的方法:

    protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
    {
        Action<object> execute = s => this.Execute();
        var task = new Task(execute, state, CancellationToken.None, TaskCreationOptions.PreferFairness);
        task.ContinueWith(s => callback(s));
        task.Start();
        return task;
    }

    protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
    {
        var task = result as Task;
        Contract.Assert(task != null);
        if (task.IsFaulted && task.Exception != null)
        {
            Contract.Assert(
                task.Exception.InnerException != null,
                "It is expected that the inner exception in a task is not null");
            const string Message = "An exception was thrown while doing something";
            Logger.ErrorException(Message, task.Exception.InnerException);
            throw new WorkflowApplicationException(Message, task.Exception.InnerException);
        }
    }

    private void Execute()
    {
         // Do something here
    }

在异步代码活动中处理异常是否正确?如果是,我应该如何防止我的工作流程中止(有时重启IIS)? 感谢

1 个答案:

答案 0 :(得分:1)

我不认为WorkflowApplicationException是由您的代码抛出的。如果某个地方我们以不同方式处理此异常并且不调用TryCatch块,我不会感到惊讶,因为这个异常(及其子类)通常是由工作流运行时引发的,并且不会是如果运行时被冲洗,则在活动中捕获它们。

你可以尝试抛出一个不同的异常,看看是否会产生影响。