2015-07-14 10 views
11

Nói cách khác, làĐang gọi Task.Wait() ngay sau khi hoạt động không đồng bộ tương đương với việc chạy cùng một thao tác đồng bộ?

var task = SomeLongRunningOperationAsync(); 
task.Wait(); 

chức năng giống với

SomeLongRunningOperation(); 

Nói cách khác, là

var task = SomeOtherLongRunningOperationAsync(); 
var result = task.Result; 

chức năng giống với

var result = SomeOtherLongRunningOperation(); 

Theo Task.Wait and Inlining, nếu Tác vụ là Wait ’đã bật đã bắt đầu thực hiện, Wait phải chặn. Tuy nhiên, nếu nó chưa bắt đầu thực hiện, Wait có thể kéo tác vụ đích ra khỏi bộ lập lịch mà nó được xếp hàng đợi và thực thi nó nội dòng trên luồng hiện tại.

Hai trường hợp đó chỉ là vấn đề quyết định chuỗi nào Task sẽ chạy và nếu bạn vẫn đang chờ kết quả, có quan trọng không?

Có lợi ích gì khi sử dụng biểu mẫu không đồng bộ trên biểu mẫu đồng bộ, nếu không có gì thực hiện giữa cuộc gọi không đồng bộ và Wait()?

+0

Vì SomeLongRunningOperation trả về một số kết quả, tôi giả sử bạn có nghĩa là 'var result = task.Result' – EZI

+0

Vâng, đúng vậy. –

+0

Task.Result là một op chặn. Không cần phải 'Chờ đợi() ' – EZI

Trả lời

9

Dưới đây là một số khác biệt:

  1. Việc tính toán có thể chạy trên một sợi khác nhau. Nó có thể chạy trên cùng một luồng nếu nhiệm vụ này dựa trên CPU và có thể được inlined. Điều này là không xác định.
  2. Nếu không có nội tuyến xảy ra, một chuỗi khác sẽ được sử dụng trong quá trình tính toán. Điều này thường tốn 1MB bộ nhớ ngăn xếp.
  3. Ngoại lệ sẽ được bao bọc trong AggregateException. Ngăn xếp ngoại lệ sẽ khác.
  4. The task version might deadlock if the computation posts to the current synchronization context.
  5. Nếu chủ đề được tối đa hóa, điều này có thể bế tắc nếu nhiệm vụ hoàn thành tác vụ khác phải được lên lịch.
  6. Trạng thái địa phương theo chủ đề, chẳng hạn như HttpContext.Current (không thực sự là địa chỉ trong luồng nhưng gần như), có thể khác nhau.
  7. Hủy bỏ chủ đề của chuỗi chính sẽ không đến được cơ quan nhiệm vụ (trừ trường hợp nội tuyến). Tôi không chắc liệu bản thân sự chờ đợi có bị hủy bỏ hay không.
  8. Tạo Task gây ra rào cản bộ nhớ tại sao có thể có hiệu ứng đồng bộ hóa.

Điều này có quan trọng không? Quyết định cho chính mình bằng danh sách này.

Có lợi ích để thực hiện việc này không? Tôi không thể nghĩ ra được. Nếu tính toán của bạn sử dụng IO không đồng bộ, việc chờ đợi sẽ vô hiệu hóa các lợi ích mà IO không đồng bộ mang lại. Một ngoại lệ sẽ là IO ra khỏi quạt, ví dụ: phát hành 10 yêu cầu HTTP song song và chờ chúng. Bằng cách đó bạn có 10 hoạt động với chi phí của một sợi.

Lưu ý rằng WaitResult tương đương với tất cả những điều này.

+0

Âm thanh như những rủi ro không vượt quá lợi ích (nếu có bất kỳ. không đề cập đến bất kỳ lợi ích nào). –

+1

Bạn mong đợi những lợi ích gì? Tôi không biết bất kỳ điều gì, ngoại trừ nếu bạn rõ ràng muốn bất kỳ hành vi nào được liệt kê. – usr

+0

Tôi tìm thấy điều này trong một số mã mà tôi đã không viết, và giả định rằng phải có một số lý do nó là theo cách này. Nhưng không có bất cứ điều gì xung quanh mã tôi thấy rằng cho thấy nó cần bất kỳ hành vi này. –

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