0

ワークフローで例外がキャッチされないという問題が発生しています。TryCatch で囲まれたカスタム AsyncCodeActivity があります。とにかく、例外はキャッチされず、さらに悪いことに、ワークフローをホストしている IIS プールが再起動されることがあります。この質問/回答 ( TryCatch アクティビティにもかかわらずワークフローから例外がエスケープされる) を見て、問題は例外を再スローする方法にあると考えています。これは、通常、非同期コード アクティビティを記述する方法です。

    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 が再起動される) のを防ぐにはどうすればよいですか? ありがとう

4

1 に答える 1

1

WorkflowApplicationException がコードによってスローされることを意図していたとは思いません。この例外 (およびそのサブクラス) は通常、ワークフロー ランタイムによってスローされ、アクティビティでそれらをキャッチするポイントがないため、どこかでこの例外を別の方法で処理し、TryCatch ブロックを呼び出さなくても驚かないでしょう。ランタイムはホースです。

別の例外をスローして、違いが生じるかどうかを確認できます。

于 2012-08-16T16:16:41.210 に答える