2016-05-02 7 views
5

私は(Entity Frameworkのを使用して)DBへの変更をコミットし、次の方法があります。同じ方法で複数の待機を使用した場合の効果?

public async Task<int> CommitAsync(Info info) 
{ 
    if (this.Database.Connection.State == ConnectionState.Closed) 
     await this.Database.Connection.OpenAsync(); 

    await SetInfo(info); 
    return await base.SaveChangesAsync(); 
} 

はそのまま使用しても安全上の方法です、またはI必要があります。

  1. async-awaitを使用しないでください、または
  2. 使用ContinueWith

答えて

12

それは、複数のawait expreを持つことが絶対にいいのよ同じ非同期メソッドでは、それは比較的無駄な機能になります。

基本的には、このメソッドは最初のawaitに達するまで同期的に実行され、関連する待ち時間はまだ完了していません。その後、呼び出し元に戻り、残りの非同期メソッドを実行するための待ち時間を設定します。実行が後のawaitから「再開」、それは左の場所に運ぶたび方法等、

をawaitableが既に完了していない、継続がそのawaitable上に設定されている別のawait発現に達した場合これは、コンパイラがあなたのためにステートマシンを構築することによって実現されます。

+0

私の理解は正しいですか?私たちが2つのコードを待っているのは、2つ目の待ってから2番目のコードを待つだけです。最初のコードを待たずに、2番目のコードを実行した後のコードは、最初のコード – YakRangi

+0

@Rouftantical:はい、私は "それは中断したところから持ち越している"と言ったように –

2

あなたのコードは完璧に見えます。それはあなたの呼び出し元に、すべてが終了するまで誰もが忙しく待っているのではなく、待っている瞬間に役に立つ何かをする機会を与えます。

ContinueWithを使用する代わりにasync-awaitを使用するのは、コードがかなり同期していることです。どのステートメントが実行されるかは簡単に分かります。 ContinueWithで注文を指定することもできますが、見るのが少し難しいです。

スレッドが非同期プロシージャに入ると、スレッドは待機状態になるまでプロシージャを実行します。待機しているプロシージャが終了するまで待つのではなく、呼び出し元に制御が戻ってきます。呼び出し元に制御が渡されます。呼び出し元に制御が渡され、待機状態になるまで次の文を実行します。 OpenAsyncの後のステートメントは、もう一度待つまで続きます。

ここで誰かが、breakfast metaphorのasync-awaitプロセスを私に説明しました。

非常に有用な紹介、Stephen Cleary about Async-await。 async-awaitがInvokeRequiredの問題をどのように防止するかを理解できます

+1

朝食のメタファーはEric Lippertから始まったと思います。それはhttp://www.i-programmer.info/professional-programmer/i-programmer/7154-c-guru-an-interview-with-eric-lippert.html?start=1私は両方のSkeet 、ClearyとLippertはここ数年の間に鷹のように見えます。果物や動物のかごの隠喩についても読んでください。 – Zuzlx

関連する問題