8

次の「ファイア アンド フォーゲット」ユース ケースを考えてみましょう。

呼び出し元が私のメソッドからいくつかのデータを要求します。私の方法では、キャッシュをチェックして、データが既に存在するかどうかを確認します。そうでない場合は、ソースからフェッチしてキャッシュします。呼び出し元は結果を取得する前にキャッシュが発生するのを待つ必要はありません。メソッドは、キャッシュがたまたま失敗した場合に呼び出し元が結果を取得するのを妨げてはなりません。私が今日持っているものは、次のようになります。

public Foo GetFoo(string fooKey)
{
    // look for Foo with fooKey in cache
    // if Foo is not found, get Foo with fooKey from source
    // and assign it to local variable myFoo
    Task cacheTask 
           = Task.Run
                (
                    () => CacheFoo(myFoo)// fire-and-forget the caching of myFoo
                ); 
    return myFoo;
}

CacheFoo が例外をスローすると、それは監視されなくなり、最終的に (.Net 4.5 では) フレームワークによって飲み込まれます。自分で例外をクリーンアップする最後のショットが必要ですが、現在のスレッドをブロックしたくありません。それを行う最善の方法は何ですか?

これが私が試したものです

try
{
    ...
   cacheTask.ContinueWith
            (
                (e) => { 
                         if (cacheTask.IsFaulted) 
                            { 
                             /* log cacheTask.Exception */; 
                             } 
                        }
                , TaskContinuationOptions.OnlyOnFaulted
            ); 
}

より良い方法はありますか?IsFaulted に "if" ステートメントが必要ですか、それとも既に "OnlyOnFaulted" を指定しているので冗長ですか?

ご意見/ご提案をお待ちしております。

4

1 に答える 1