2012-10-08 18 views
12

Trong một ứng dụng WPF 4.5, tôi không hiểu tại sao giao diện người dùng bị chặn khi tôi sử dụng chờ đợi + một nhiệm vụ:async công tác tôi luôn khối UI

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Task.Delay works great 
     //await Task.Delay(5000); 

     double value = await JobAsync(25.0); 

     MessageBox.Show("finished : " + value.ToString()); 
    } 

    private async Task<double> JobAsync(double value) 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    } 

Các chờ đợi Task.Delay hoạt động tuyệt vời, nhưng chờ đợi JobAsync chặn giao diện người dùng. Tại sao ? Cảm ơn bạn.

Trả lời

9

Hãy thử điều này:

private Task<double> JobAsync(double value) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    }); 
} 
+2

Thay vì bắt đầu nhiệm vụ bên trong các phương pháp đó có thể làm cho hơn ý nghĩa để thêm một cuộc gọi 'Task.Run' trên dòng với' await', mặc dù kết quả cuối cùng (nếu hàm này không bao giờ được sử dụng lại) là giống hệt nhau. – Servy

+2

Im trong một kịch bản tương tự, vẫn chặn Chủ đề giao diện người dùng. Có bất kỳ gotchas rõ ràng? – IbrarMumtaz

23

Bạn nên nhận được một cảnh báo về JobAsync - nó không chứa await biểu thức. Tất cả công việc của bạn vẫn đang được thực hiện trên chuỗi giao diện người dùng. Có thực sự không có gì không đồng bộ về phương pháp.

Đánh dấu phương thức là async không làm cho nó chạy trên một luồng khác - nó giúp việc kết hợp các hoạt động không đồng bộ trở nên dễ dàng hơn và trở lại ngữ cảnh thích hợp.

tôi nghi ngờ nó sẽ là một ý tưởng tốt để lùi lại một bước và tiếp thu một số tài liệu về async trên MSDN ... this is a good starting point ...

+0

Ok cảm ơn, tôi hiểu ngay bây giờ :) – Nico

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