48

I/O バウンドのメソッド (DB 呼び出しを行うメソッドなど) があるとします。このメソッドは、同期と非同期の両方で実行できます。あれは、

  1. 同期:

    IOMethod()
    
  2. 非同期:

    BeginIOMethod()
    EndIOMethod()
    

次に、以下に示すようにさまざまな方法でメソッドを実行すると、リソース使用率の観点からパフォーマンスの違いは何ですか?

  1. var task = Task.Factory.StartNew(() => { IOMethod(); });
    task.Wait();
    
  2. var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
    task.Wait();
    
4

2 に答える 2

79
var task = Task.Factory.StartNew(() => { IOMethod(); });
task.Wait();

IOMethod()これにより、実行中のスレッド プール スレッドがブロックされ、 Wait(). ブロックされたスレッドの合計: 2。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
task.Wait();

これにより、(ほとんどの場合) スレッドを使用せずに操作が非同期で実行されますが、Wait(). ブロックされたスレッドの合計: 1。


IOMethod();

IOMethod()これにより、実行中に現在のスレッドがブロックされます。ブロックされたスレッドの合計: 1。

現在のスレッドをブロックする必要がある場合、またはブロックしても問題ない場合は、TPL を使用しようとしても実際には何も得られないため、これを使用する必要があります。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
await task;

これにより、スレッドを使用せずに操作が非同期で実行され、 のおかげで操作が非同期で完了するのも待機しawaitます。ブロックされたスレッドの合計: 0。

これは、非同期を利用したい場合に使用する必要があり、C# 5.0 を使用できます。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
task.ContinueWith(() => /* rest of the method here */);

これにより、スレッドを使用せずに操作が非同期で実行され、 のおかげで操作が非同期で完了するのも待機しContinueWith()ます。ブロックされたスレッドの合計: 0。

これは、非同期を利用したいが C# 5.0 を使用できない場合に使用する必要があります。

于 2013-07-02T19:14:45.283 に答える