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 を使用できない場合に使用する必要があります。