ワークフローで例外がキャッチされないという問題が発生しています。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 が再起動される) のを防ぐにはどうすればよいですか? ありがとう