var task = Task.Factory.StartNew(() => { IOMethod(); });
task.Wait();
当执行IOMethod()
时,这将会阻塞线程池线程,并且由于Wait()
的存在也会阻塞当前线程。总共被阻塞的线程数为2。
var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
task.Wait();
这将(很可能)异步执行操作而不使用线程,但由于Wait()
的作用,它会阻塞当前线程。总阻塞线程数:1。
这将(很可能)异步执行操作,而不使用线程,但由于使用了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,则应使用此方法。
FromAsync
时,你(可能)不会有一个线程池线程闲置无事可做,但如果你使用StartNew
,就会有。如果你要处理大量的任务,过度使用线程池可能会导致性能问题。 - Servy