2016-09-16 9 views
0

このシナリオでは、そのルートに行く前に実行可能かどうかをチェックしたかったのです。トップレベルの機能を持つネストされた非同期コールが待ち受けています

私はwebApiプロジェクトを持っていますが、HttpContext.Current.Itemsにデータを追加するdelegateHandlerがあります。コントローラでは、私がconfigureawait(false)を使ってやっている非同期呼び出しはほとんどありません。ライブラリDLLと同じです。

全体のコードは、この..... DLLで

コントローラで

public async Task<Entity> func() 
{ 

HttpContext.Current.Items.Add(key, value); 

await DBCalls.Method1Async().configureawait(false); 
await DBCalls.Method2Async().configureawait(false); 

var data = HttpContext.Current.Items[key]; 

// rest of the method 
} 

のように見える実行が背中に再開したときに、クラスDBCalls

async void Method1Async() 
{ 
    await internalMethod1().configureawait(false) 
} 
async void Method2Async() 
{ 
    await internalMethod2().configureawait(false) 
} 

質問ですコントローラの関数は、HttpContext.Current.Itemsから戻って格納されたデータを取得しますか?

+0

[この](http://stackoverflow.com/questions/ 28427675 /正しい使用方法 - httpcontext-current-user-with-async-await)は一般的にあなたの質問に答えるべきです。 –

+0

@Yuval Itzchakov私はTask.WhenAll(task1、task2)へのコードを変更するとコントローラーで意味しますか.configureawait(true);これはリクエストコンテキストを再入力する必要があります – akhileshcoer

答えて

3

実行時にコントローラ機能を再開すると、格納されたデータはHttpContext.Current.Itemsから返されますか?

いいえ、あなたはしません。 ConfigureAwait(false)の場合は、の場合はを前のコンテキストで再開する必要はありません。しかし、HttpContext.Currentにアクセスするには、それが必要です。

「ライブラリ」コード(InternalMethodNなど、おそらくMethod1Asyncなど)にConfigureAwait(false)を使用する必要があります。これは、コンテキストに依存しません。しかし、ASP.NETリクエストコンテキストに戻る必要がある "アプリケーション"コードでは、ConfigureAwait()を使用しないでください。

だから、あなたのコードは次のようになります。私はasync Taskasync voidからMethodNAsyncを変更した

public async Task<Entity> Func() 
{ 
    HttpContext.Current.Items.Add(key, value); 

    await DBCalls.Method1Async(); 
    await DBCalls.Method2Async(); 

    var data = HttpContext.Current.Items[key]; 

    // rest of the method 
} 

async Task Method1Async() 
{ 
    await InternalMethod1().ConfigureAwait(false); 
} 

async Task Method2Async() 
{ 
    await InternalMethod2().ConfigureAwait(false); 
} 

注意。あなたはあなたが持っていなければasync voidの方法を使うべきではありません。確かにawaitにはできません。

また、私は実際のMethodNAsyncが実際に何かをしていると仮定しています。彼らはただ内部メソッドに委譲する場合は、あなただけ(それらがさらに短くするC#6.0の式ボディのメソッドを使用して)するためにそれらを簡素化することができます:

Task Method1Async() => InternalMethod1(); 

Task Method2Async() => InternalMethod2(); 
+0

あなたの最後のスニペットでは、あなたのリファクタが与えられていれば、それらのメソッドは 'async'であってはなりません。 – Servy

+0

@Servyあなたは正しいです。ありがとう、固定。 – svick

+0

それは私の疑いをクリアします。 – akhileshcoer

関連する問題