2012-11-29 62 views
80

Tôi có thể đợi phương thức void async để hoàn thành công việc của mình như thế nào?Đợi phương thức không đồng bộ void

ví dụ, tôi có một chức năng như dưới đây:

async void LoadBlahBlah() 
{ 
    await blah(); 
    ... 
} 

bây giờ tôi muốn chắc chắn rằng tất cả mọi thứ đã được tải trước khi tiếp tục ở một nơi khác.

Trả lời

97

Thực hành tốt nhất là để đánh dấu chức năng async void chỉ khi nó là lửa và quên phương pháp, nếu bạn muốn chờ đợi, bạn nên đánh dấu nó là async Task.

Trong trường hợp nếu bạn vẫn muốn chờ đợi, sau đó quấn nó như vậy await Task.Run(() => blah())

51

Nếu bạn có thể thay đổi chữ ký của chức năng của bạn để async Task sau đó bạn có thể sử dụng mã được trình bày here

2

Bạn không thực sự cần phải làm bất cứ điều gì bằng tay, await từ khóa tạm dừng chức năng thực hiện cho đến khi blah() lợi nhuận.

private async void SomeFunction() 
{ 
    var x = await LoadBlahBlah(); <- Function is paused 
    //do more stuff when LoadBlahBlah() returns 
} 

private async Task<T> LoadBlahBlah() 
{ 
    return await blah(); <- function is paused 
} 

T là loại đối tượng blah() lợi nhuận

Bạn có thể không thực sự await một hàm void nên LoadBlahBlah() không thể là void

+0

Tôi muốn đợi cho 'LoadBlahBlah()' để kết thúc, không phải 'blah()' – MBZ

+0

@MBZ cập nhật câu trả lời – Mayank

+5

Thật không may async trống phương pháp làm không tạm dừng thực thi (không giống như các phương thức Task async) – ghord

17

Giải pháp tốt nhất là sử dụng async Task. Bạn nên tránh async void vì nhiều lý do, một trong số đó là tính tương thích.

Nếu phương pháp không có thể được thực hiện để trở Task (ví dụ, đó là một event handler), sau đó bạn có thể sử dụng SemaphoreSlim có tín hiệu phương pháp khi đó là về để thoát. Xem xét thực hiện việc này trong khối finally.

2

thực hiện AutoResetEvent, gọi hàm sau đó đợi AutoResetEvent và sau đó đặt nó bên trong khoảng trống không đồng bộ khi bạn biết nó được thực hiện.

Bạn cũng có thể chờ đợi vào một nhiệm vụ trả về từ khoảng trống async của bạn

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