2013-05-11 18 views
6

Tại sao giá trị mặc định cho CreationOptions của một Task được tạo bằng cách sử dụng Task.RunDenyChildAttach thay vì None?Mặc định TaskCreationOptions trong Task.Run

Có liên quan gì đến việc làm việc với asyncawait mới trong C# 5.0 đơn giản hơn (bằng cách ngăn bạn thoát khỏi trình lập lịch hiện tại của ngữ cảnh hiện tại tôi đoán)?

Trả lời

7

Stephen Toub giải thích rõ điều này in his blog post on the subject.

Parent and child tasks là hơi phổ biến khi sử dụng Task s theo cách song song. Lưu ý rằng khi một phụ huynh Task có con, ngữ nghĩa hoàn thành của phụ huynh thay đổi một cách tinh tế.

Nhiệm vụ cha/mẹ gần như không bao giờ được sử dụng khi sử dụng Task s theo kiểu async. Trong thế giới async, bạn có một loại "mối quan hệ cha mẹ/con hợp lý" khi một phương thức async gọi một phương thức khác, nhưng nó không thực sự được triển khai bằng cách sử dụng nhiệm vụ cha/con.

Thông thường, Task được thiết kế để sử dụng trong mã async không mong muốn có ngữ nghĩa hoàn thành được thay đổi bởi nhiệm vụ con đính kèm với nó. Do đó, mặc định mới cho Task.RunDenyChildAttach, điều này ngăn cản bất kỳ tác vụ con nào cố đính kèm.

3

Tại sao giá trị mặc định cho CreationOptions của Tác vụ được tạo bằng cách sử dụng Task.Run là DenyChildAttach chứ không phải là Không?

Không có tùy chọn (mặc định hoặc khác) trong việc tạo tác vụ bằng cách sử dụng Task.Run Method.

Trích dẫn từ Task.Run vs Task.Factory.StartNew (by Stephen Toub - MSFT):

  • Task.Run "đơn giản nên được coi như là một cách nhanh chóng để sử dụng Task.Factory.StartNew mà không cần phải xác định một loạt các thông số Đó là một phím tắt."
  • Task.Run(someAction); là chính xác tương đương với:

    Task.Factory.StartNew 
        ( someAction 
         , CancellationToken.None 
         , TaskCreationOptions.DenyChildAttach 
         , TaskScheduler.Default 
        ); 
    
  • "bằng cách này, Task.Run có thể và nên được sử dụng cho các trường hợp phổ biến nhất"

MSDN bài viết Nested Tasks and Child Tasks (for .NET 4.0, tức mà không cần bất kỳ equivokes cho C# 5.0/NET 4.5) khẳng định:

"trong hầu hết các tình huống, chúng tôi khuyên bạn nên sử dụng nhiệm vụ lồng nhau vì mối quan hệ với các nhiệm vụ khác là ít phức tạp. Đó là lý do tại sao công việc tạo ra bên trong các nhiệm vụ khác được lồng theo mặc định, và bạn phải xác định rõ ràng các tùy chọn AttachedToParent để tạo ra một nhiệm vụ trẻ em"

điều này giải thích tại sao CreationOptions.DenyChildAttach đã được lựa chọn cho các tùy chọn phổ biến nhất và đơn giản nhất của phím tắt.

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