var task = Task.Factory.StartNew(() => { IOMethod(); });
task.Wait();
này sẽ chặn một thread hồ bơi trong khi IOMethod()
được thực hiện và cũng chặn chủ đề hiện tại của bạn vì Wait()
. Tổng số chủ đề bị chặn: 2.
var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ...);
task.Wait();
chí này (rất có thể) thực hiện các hoạt động không đồng bộ mà không sử dụng một chủ đề, nhưng nó sẽ chặn các thread hiện hành vì Wait()
. Tổng số chủ đề bị chặn: 1.
IOMethod();
Điều này sẽ chặn luồng hiện tại trong khi IOMethod()
đang thực thi. Tổng số chủ đề bị chặn: 1.
Nếu bạn cần chặn luồng hiện tại, hoặc nếu chặn nó là phù hợp với bạn, thì bạn nên sử dụng điều này, vì cố gắng sử dụng TPL sẽ không thực sự cung cấp cho bạn bất cứ điều gì.
var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ...);
await task;
này sẽ thực hiện các hoạt động không đồng bộ mà không sử dụng một chủ đề, và nó cũng sẽ chờ đợi cho các hoạt động để hoàn thành đồng bộ, nhờ await
. Tổng số chủ đề bị chặn: 0.
Đây là những gì bạn nên sử dụng nếu bạn muốn tận dụng lợi thế của không đồng bộ và bạn có thể sử dụng C# 5.0.
var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ...);
task.ContinueWith(() => /* rest of the method here */);
này sẽ thực hiện các hoạt động không đồng bộ mà không sử dụng một chủ đề, và nó cũng sẽ chờ đợi cho các hoạt động để hoàn thành đồng bộ, nhờ ContinueWith()
. Tổng số chủ đề bị chặn: 0.
Đây là những gì bạn nên sử dụng nếu bạn muốn tận dụng lợi thế của sự không đồng bộ và bạn không thể sử dụng C# 5.0.
Câu trả lời ngắn gọn, bạn (có thể) không có chuỗi chủ đề nằm ở đó không làm gì khi sử dụng 'FromAsync', nếu bạn sử dụng' StartNew'. Nếu bạn đang làm rất nhiều thứ, nhấn mạnh hồ bơi luồng có thể là một vấn đề hiệu suất. – Servy
Nhân bản: http://stackoverflow.com/questions/5018897/tpl-taskfactory-fromasync-vs-tasks-with-blocking-methods – shambulator