1

私は、このコードの間に差がある知っている:なぜ私は、Task.Runで同期非同期関数をラップするよりもAPI非同期関数を使用するほうがいいですか?

var streamWriter = new StreamWriter("something.txt"); 
streamWriter.WriteAsync("text"); 

と、この:

var streamWriter = new StreamWriter("something.txt"); 
Task.Run(()=> streamWriter.Write("text")); 

最初のものははるかに理にかなっています。

と異なるシナリオでは、私は結果を待っていたときに、このコード:

var streamReader = new StreamReader("something.txt") 
char[] chars = new char[10]; 

Task<int> task = streamReader.ReadAsync(chars, 0, chars.Length); 
//Do something... 

int num = await task; 
//Do something with num... 

はこれよりはるかに理にかなって:

var streamReader = new StreamReader("something.txt") 
char[] chars = new char[10]; 

Task<int> task = Task.Run(()=>streamReader.Read(chars, 0, chars.Length)); 
//Do something... 

int num = await task; 
//Do something with num... 

私は非同期APIで構築されたの使用であると思います明快さだけでなく、ThreadPoolスレッドを何も理由なく待っているよりも、実際にはThreadPoolスレッドをより効率的に、より効率的に管理します。

それは正しいですか?

+0

これは、典型的な純粋な非同期対同期の非同期質問です。 –

+0

「DoSomethingSomethingAsync」メソッドを実装した人々が問題のドメインを理解していて、実際には良い非同期ストーリーを実装するうえで効果的でした。もう1つの方法は、同期呼び出しを行う明示的なタスクを生成することは、「私はそれらを信頼しません」と言っています。私はあなたがそれらを信頼すべきだと思います。 –

+0

一般的に、非同期メソッドを使用する方がタスクを生成してから、そのタスクで同期メソッドを呼び出すよりも、常に*選択することをお勧めします。ここでも、非同期メソッドを作成した人は、自分が何をしているかを知っていました。 –

答えて

4

Task.Runでラップされた同期呼び出しは、その操作の間スレッドプールスレッドをブロックします。真に非同期の実装will not

特にストリームでは、操作が「本当に非同期」であるかどうかは、決定するのが少し難しいことがあります。たとえば、ネットワークストリームは常に真に非同期です。メモリストリームは本当に非同期ではなく、特別なフラグをコンストラクタに渡すとファイルストリームは本当に非同期になります。

関連する問題