2015-04-17 11 views
99

Tôi chỉ thấy 3 thói quen liên quan đến việc sử dụng TPL mà làm cùng công việcVề sử dụng Task.Start(), Task.Run() và Task.Factory.StartNew()

đây là mã

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Create a task and supply a user delegate by using a lambda expression. 
    Task taskA = new Task(() => Console.WriteLine("Hello from taskA.")); 
    // Start the task. 
    taskA.Start(); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Define and run the task. 
    Task taskA = Task.Run(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
         Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Better: Create and start the task in one operation. 
    Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 

    taskA.Wait();     
} 

Tôi chỉ không hiểu tại sao MS đưa ra 3 cách khác nhau để chạy công việc trong TPL vì tất cả chúng đều hoạt động giống nhau: Task.Start(), Task.Run()Task.Factory.StartNew().

Cho tôi biết, là Task.Start(), Task.Run()Task.Factory.StartNew() tất cả được sử dụng cho cùng một mục đích hoặc chúng có ý nghĩa khác nhau?

Khi nào nên sử dụng Task.Start(), khi Task.Run() và khi nào thì nên sử dụng Task.Factory.StartNew()?

Hãy giúp tôi hiểu cách sử dụng thực tế của họ theo từng trường hợp chi tiết với ví dụ, cảm ơn.

+0

có một [bài viết cũ giải thích rằng tại đây] (http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx) và [tại đây cho tác vụ mới hơn 'Task.Run '] (http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx) - có thể điều này sẽ trả lời câu hỏi của bạn;) – Carsten

+0

[Here] (http://stackoverflow.com/a/21427264/1768303) là một ví dụ về nơi 'Task.Start' thực sự hữu ích. – Noseratio

Trả lời

108

Task.Run là viết tắt của Task.Factory.StartNew với đối số an toàn cụ thể:

Task.Factory.StartNew(
    action, 
    CancellationToken.None, 
    TaskCreationOptions.DenyChildAttach, 
    TaskScheduler.Default); 

Nó đã được bổ sung trong Net 4.5 để giúp đỡ với việc sử dụng ngày càng thường xuyên của async và làm việc giảm tải cho ThreadPool.

Task.Factory.StartNew (được thêm bằng TPL trong .Net 4.0) mạnh mẽ hơn nhiều. Bạn chỉ nên sử dụng nó nếu Task.Run không đủ, ví dụ như khi bạn muốn sử dụng TaskCreationOptions.LongRunning (mặc dù nó không cần thiết khi đại biểu không đồng bộ. Hơn thế nữa trên blog của tôi: LongRunning Is Useless For Task.Run With async-await). Thông tin khác trên Task.Factory.StartNew trong Task.Run vs Task.Factory.StartNew

Đừng bao giờ tạo Task và gọi Start() trừ khi bạn tìm thấy lý do cực kỳ tốt để làm như vậy. Nó chỉ nên được sử dụng nếu bạn có một số phần cần tạo nhiệm vụ nhưng không lên lịch cho chúng và một phần khác có lịch biểu mà không cần tạo. Đó gần như không bao giờ là một giải pháp thích hợp và có thể nguy hiểm. Thông tin khác trong "Task.Factory.StartNew" vs "new Task(...).Start"

Kết luận, chủ yếu sử dụng Task.Run, sử dụng Task.Factory.StartNew nếu bạn phải và không bao giờ sử dụng Start.

+2

u nói "Đừng bao giờ tạo ra một nhiệm vụ và gọi Start()" chuyển hướng tôi đến bất kỳ tốt viết lên mà sẽ cho thấy rằng có thể gây ra bởi Task.Start(). tôi cần chi tiết bởi vì u r nói để tránh nó. cảm ơn bạn đã trả lời. – Mou

+0

@Bạn đã có ... – i3arnon

+0

r u nói về liên kết này http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx ?? – Mou

0

Ngoài Câu trả lời, bạn không nên tạo Tác vụ từ hàm tạo mà không có lý do thuyết phục. TPL mất rất nhiều sự chăm sóc với đồng bộ hóa và concurrency.It ẩn những phức tạp từ mã khách hàng. Nếu bạn xây dựng một nhiệm vụ và bắt đầu nó, bạn cần phải suy nghĩ về đồng bộ hóa và đồng thời mà rõ ràng là khó xử lý.

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