2017-03-29 21 views
9

Khi nào một tác vụ thực sự bắt đầu?Khi nào một nhiệm vụ C# thực sự bắt đầu?

public void DoSomething() { 
    Task myTask = DoSomethingAsync(); 

    Task.WaitAll(new[] { myTask }, 2000); 
} 

public async Task DoSomethingAsync() { 
    await SomethingElse(); 
} 

Liệu nó bắt đầu ngay lập tức khi khởi tạo nó trong Task myTask = DoSomethingAsync(); hay nó bắt đầu khi bạn nói phải chờ cho nó trong Task.WaitAll(new[] { myTask }, 2000);?

+1

Đây là một câu hỏi lớn. Có một cái nhìn ở đây cho người mới bắt đầu: http://blog.stephencleary.com/2013/11/there-is-no-thread.html –

+1

Bạn đã thực hiện bất kỳ nghiên cứu nào chưa? – PJvG

+1

@PJvG Vâng, tất nhiên rồi. Không thể tìm thấy bất kỳ câu trả lời thỏa mãn nào. – GTHvidsten

Trả lời

10

Gọi phương thức async trả về tác vụ nóng, một tác vụ đã được bắt đầu. Vì vậy, không có mã thực sự cần thiết để buộc nó chạy.

Theo MSDN (thanks to Stephen Cleary) mẫu mẫu không đồng bộ dựa trên nhiệm vụ (TAP) requires returned tasks to be hot. Điều đó có nghĩa là tất cả các tác vụ, ngoại trừ các tác vụ được tạo với new Task sẽ nóng.

Từ bài viết tham khảo:

Nhiệm vụ đó được tạo ra bởi các nhà xây dựng Task nào được gọi nhiệm vụ như lạnh ... Tất cả các nhiệm vụ khác bắt đầu chu kỳ cuộc sống của họ trong trạng thái nóng.

+0

vui mừng khi biết sự khác biệt – Charlesliam

+1

"Khi bạn gọi một phương thức trả về Tác vụ mà không được đồng bộ hóa, nó sẽ không được bắt đầu". nghe có vẻ hơi khó hiểu với tôi. Đa số các phương thức trả về tác vụ mà không có async vẫn trả về tác vụ đã bắt đầu, bởi vì chúng bắt đầu nó bên trong chính phương thức đó. – Evk

+0

@Evk 'automatic'> tốt hơn? –

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