3

私はオンラインで探していて、うまくいけばここの誰かが私に答えてくれるいくつかの質問があります. IIS のクラッシュの原因となった問題を解決しようとしています。このサービス コールは、ファイア アンド フォーゲット タイプのコールであるはずです。失敗した場合は、例外を抑制してログに記録します。これは長時間実行されるサービス呼び出しであるため、非同期として実装されました。現在の実装には、次のようにネストされたメソッド呼び出しがいくつかあります。

// in first service
public void PerformService(some params)
{
    // setup and validation

    DoAction();
}
private void DoAction()
{
    // final setup

    OtherService.FireAndForgetAsync(some params);
}

// in the other service (OtherService)
public async Task FireAndForgetAsync()
{
    await Task.Run(() => 
    {
        try 
        {
           // do some long running stuff
        }
        catch (Exception e)
        {
            ErrorLogger.LogError(e)
        }
    }
}

事実上、PerformService を呼び出すループ (0 から多くの反復) にあり、現在、次の例外が発生しています。

System.NullReferenceException: Object reference not set to an instance of an object. at   
System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonati onContext) at 
System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationCo ntext) at
System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallb ack callback, Object state) at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback call back, Object state) at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAct ion(Object state) at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback c allback, Object

(エラー ロガーをテストするために) try catch ブロックで強制的に例外を発生させた場合でも、エラー ロガーによって適切にキャッチされ、ログに記録されます。リクエストが完了した後、一部のスレッドがまだ SynchronizationContext.Post を実行しようとしているようです。FireAndForgetAsync が await を実行しているという意味で、C# 5 の async/await を不適切に使用していると考えていますが、他には何もありません。それで、私たちは待つつもりだと言っていますが、それからただ去ります。http 要求が終了すると、同期するものが残っていないため、それ自体を同期することはできません。これはフルオンで IIS がクラッシュするため良くありません。私は C# 5 の async/await と適切な解決策についてあまり詳しくないので、主に他の人の意見を求めています。終わるのを待ちたくないので、

4

2 に答える 2