2013-10-01 19 views
5

Tôi muốn bỏ chặn các chuỗi sử dụng ui.tác vụ và bỏ chặn giao diện người dùng

Ông có thể cho tôi biết sự khác biệt giữa các mã này là gì:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    return await Task.Run(() => 
    { 
     Thread.Sleep(5000); 
     return number1 + number2; 
    }); 
} 

Và mã này:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    await Task.Delay(5000); 
    return number1 + number2; 
} 
+0

bản sao có thể có của [Thread.Sleep vs Task.Delay?] (Http://stackoverflow.com/questions/17258428/thread-sleep-vs-task-delay) – Muctadir

Trả lời

2

Sự khác biệt chính là Task.Run tạo ra một thread mới (tham khảo this MSDN documentation 's Chủ đề phần).
Vì vậy, các chủ đề mới được tạo ra khối trong 5 giây trong trường hợp đầu tiên và sau đó trả về kết quả (Trong khi đó, các chủ đề chính hiện có sẵn để sử dụng, vì vậy chờ đợi lợi nhuận trở lại điều khiển để người gọi từ Task.Run(...))

Trong giây trường hợp quá, sau khi chờ đợi, kiểm soát được chuyển giao cho người gọi và Task.Delay đang diễn ra trong chủ đề chính. Không có chủ đề mới nào được tạo.

Vì vậy, như bạn đã đề cập trong câu hỏi, nếu bạn muốn đi đa luồng, sử dụng Task.Run() cùng với asyncawait sẽ cung cấp cho bạn nhiều khả năng.

Để biết thêm chi tiết về asyncawait luồng kiểm soát, hãy tham khảo tài liệu được đề cập ở trên. Một MSDN rất hữu ích và chi tiết của nó đọc!

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