Tôi đang thử CTP không đồng bộ, phiên bản 4.5 cho phép sử dụng các phương thức không đồng bộ mà không cần phải viết phương thức Begin/End.Khi phương thức trả về void, giống như một nhiệm vụ?
Đầu dò đầu tiên của tôi là thực hiện một phương thức không đồng bộ trả về khoảng trống. Tôi thấy một vài ví dụ và thực hiện như sau:
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("click button: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
});
}
Trong dự án WPF của tôi, tôi có một hộp văn bản để xem kết quả và nút thực hiện phương pháp không đồng bộ.
Trong phương pháp async, tôi sử dụng đang chờ, đó là cần bởi vì phương pháp này là không đồng bộ và TasEx.Run để tạo một chuỗi mới trong đó thực thi mã.
Nghi ngờ của tôi là ở thời điểm này. Trong một vài ví dụ mà tôi thấy làm thế nào để tạo ra một phương pháp async trả về void, sử dụng cách này, Task.Run hoặc TaskEx.Run.
Nếu tôi không sai, Task.Run tạo một chủ đề mới để thực hiện phương pháp. Sau đó, tại sao sử dụng một phương pháp async, nếu với Task, tạo một chủ đề mới, tôi nhận được những gì tôi muốn, không để chặn các chủ đề chính?
Ngoài ra, nếu phương pháp async truy cập vào một số biến được chia sẻ, tôi phải cẩn thận với đồng thời, phải không? Vì vậy, tôi không biết lợi thế của việc sử dụng các phương thức async, ít nhất là trong trường hợp này.
Trong thực tế, tôi sử dụng cùng một mã mà không cần đồng bộ và không chờ đợi và kết quả là như nhau, chương trình chính không chặn và tất cả hoạt động như tôi mong đợi. Phương pháp này là:
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
});
}
Câu hỏi của tôi là, đây là cách chính xác để sử dụng async khi phương thức trả về void?
BTW, The Visual Studio 11 Beta là bây giờ ra, trong đó có các tính năng từ Async CTP, với một số cải tiến và sửa lỗi. – svick
Và đó là lợi ích os bằng cách sử dụng phương pháp async trong trường hợp này, nếu trong phương pháp tôi đang sử dụng một nhiệm vụ, và nhiệm vụ sử dụng một sợi niew? Nếu tôi sử dụng trực tiếp một tác vụ, mà không sử dụng một phương thức async, tôi sẽ nhận được hành vi. Có lẽ các phương pháp async có ý nghĩa hơn nếu phương thức trả về một giá trị và cho các phương thức void thì tốt hơn nên sử dụng trực tiếp một tác vụ? –
Tôi khuyên tất cả các phương thức 'async' trả về' Task' hoặc 'Task' trừ khi chúng xử lý sự kiện và * có * để trả về 'void'. Điều này cho phép bạn soạn thảo chúng nếu cần và xử lý lỗi cũng sạch hơn (nếu một phương thức 'async void' đặt ra một ngoại lệ trong ngữ cảnh WPF, nó được gửi trực tiếp đến vòng lặp thông điệp UI, vì vậy các phương thức' async void' là * không * thực sự "lửa và quên"). –