2013-06-08 28 views
22

Có sự khác biệt về chức năng giữa hai hình thức sử dụng chờ đợichờ Task.Factory.StartNew (() => so Task.Start; chờ đợi công tác;

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline")); 
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline")); 
    myTask.Start(); 
    string z = await myTask; 
    
?

Cụ thể, theo thứ tự nào là mỗi hoạt động được gọi là trong 1.? is StartNew gọi và sau đó là chờ đợi gọi, hoặc là chờ đợi gọi đầu tiên trong 1.?

Trả lời

14

StartNew chỉ là short hand for creating and starting a task. Nếu bạn muốn làm điều gì đó cho cá thể Task trước khi bạn bắt đầu, hãy sử dụng hàm tạo. Nếu bạn chỉ muốn tạo và bắt đầu tác vụ ngay lập tức, hãy sử dụng tay ngắn.

Tài liệu cho StartNew nói:

Calling StartNew là chức năng tương đương để tạo ra một nhiệm vụ bởi sử dụng một trong những nhà xây dựng của nó, và sau đó gọi phương thức Task.Start để sắp xếp công việc để thực hiện.

+0

Khi gọi myTask.Start(), GetAnimal ("feline") được gọi ngay lập tức, điều này có ý nghĩa vì tôi đã bắt đầu Tác vụ. Điều này có nghĩa là tôi có thể bắt đầu nhiều Tác vụ ngay lập tức và sau đó quyết định khi nào tôi muốn gọi chờ cho mỗi nhiệm vụ? – user42

+0

@ user42: tất nhiên. (Nhưng tôi sẽ không nói rằng gọi trong thread khác là hoàn toàn "ngay lập tức".) – Vlad

-8

Không có sự khác biệt. Chúng tạo ra mã IL chính xác.

+0

Có thể không có sự khác biệt, nhưng họ * không * sản xuất chính xác cùng một IL. – vcsjones

+5

Điều đó đơn giản là sai. Một lệnh tạo ra IL để gọi 'Task.get_Factory', sau đó gọi tới' TaskFactory.StartNew' và lệnh kia gọi một hàm tạo của 'Task ' theo sau là một lời gọi đến' Task.Start() '. – svick

24

Khi bạn đang viết mã với asyncawait, bạn nên sử dụng Task.Run bất cứ khi nào có thể.

Nhà xây dựng Task (và Task.Start) là thư viện từ Thư viện song song nhiệm vụ, được sử dụng để tạo các tác vụ chưa được bắt đầu. Không được sử dụng hàm tạo TaskTask.Start trong mã async.

Tương tự, TaskFactory.StartNew là phương pháp cũ hơn không sử dụng giá trị mặc định tốt nhất cho các tác vụ async và không hiểu async lambdas. Nó có thể hữu ích trong một vài tình huống, nhưng phần lớn thời gian Task.Run là tốt hơn cho mã số async.

+0

đây có phải là cách tốt hơn không? ... 'chuỗi đại biểu AnimalDelegate (chuỗi t);' 'AnimalDelegate a = new AnimalDelegate (GetAnimal);' 'var result = await Task.Run (() => {return a (" feline ");});' – user42

+6

Bạn chỉ có thể nói 'var result = await Task.Run (() => GetAnimal (" feline "));' –

Các vấn đề liên quan