2017-10-09 12 views
2

このコードがネット上に見つかりました。awaitとasyncをすぐに使用する理由はありますか?

If request.Content IsNot Nothing Then 
     ' Hash content to ensure message integrity 
     Using md5__1 = MD5.Create() 
      requestContentBase64String = Convert.ToBase64String(md5__1.ComputeHash(Await request.Content.ReadAsByteArrayAsync())) 
     End Using 
    End If 

仕上げに非同期ブツを待っている間に何か他のものが最初に行うことができるように、いくつかの非同期ブツを行うことの全体のポイントです。

ので

dim task = somethingasync() 
doSomething 
await task 

は意味

しかしawait somethingasyncは、私にはどんな意味がありませんになるだろう。ポイントは何ですか?あなたはとにかく何もしていません。とにかく何かが完了するまで待ってください。実際に

、メインUIスレッドの右側にすべきではない待つオペレータが含まれていても

dim task = somethingasync() 
doSomething 
await task 

スタッフ?これは、ユーザーが待たされることを望まないためです。

ここが問題です。すべてのことが非メインのUIスレッドで発生した場合、結果全体を待つことは何ですか?

なぜ同期バージョンを使用しないのですか?

+0

スニペットはバックエンド環境からのものでなければなりません。たとえば、Node.JSのようなシングルスレッド非同期モデルでは、これは完璧な意味を持ちます(非同期操作を待っている間に同時に受信要求を処理できるようにするため)。しかし、.NETのようなマルチスレッドでは?いい考えはありません。このコードを書いている間、誰かが十分な注意を払っていなかったかもしれません。マルチスレッドモデルの@DiligentKeyPresser –

+1

スレッドはスレッドプールに返され、他のものを実行することができます。 I/O操作が完了するのを待っている間、他の要求に応えてください。スレッドをブロックするということは、他の場所で役に立つことがある間にリソースをブロックすることを意味します。 – MarcinJuraszek

+0

これは必ずしもあなたのコードが何か他のことを行うことを意味するわけではありません。通常、UIスレッドは 'await'コードが完了するのを待っている間にあなたのアプリを反応させ続けるために同時にアップデートを処理できます。 – Enigmativity

答えて

1

はあなたの機能をチェックしてください:

あなたは非同期機能で非同期操作を行うことができます:あなたはのtry-catchでそれを囲む場合

//Wrong 
void AsyncCallFunc() 
    { 
     AsyncFunc(); 
     //doSomething 
    } 

//Correct 
async void TrueAsyncCallFunc() 
    { 
     await AsyncFunc(); 
     //doSomething 
    } 

また、必要に応じて最終的には内部で最終的な操作を追加することができます。

async void TrueAsyncCallFunc() 
    { 
     try{ 
      await AsyncFunc(); 
      //doSomething 
     } 
     catch(Exception){ 
      throw; 
     } 
     finally{ 
      //do last operation 
     } 
    } 
関連する問題