Trong ứng dụng tàu điện ngầm C # / XAML của tôi, có một nút khởi động quá trình dài. Vì vậy, như được đề xuất, tôi đang sử dụng async / await để đảm bảo luồng UI không bị chặn:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await GetResults();
}
private async Task GetResults()
{
// Do lot of complex stuff that takes a long time
// (e.g. contact some web services)
...
}
Đôi khi, những thứ xảy ra trong GetResults sẽ yêu cầu thêm người dùng nhập trước khi có thể tiếp tục. Để đơn giản, giả sử người dùng chỉ cần nhấp vào nút "tiếp tục".
Câu hỏi của tôi là: làm thế nào tôi có thể tạm dừng việc thực thi GetResults theo cách mà nó đang chờ một sự kiện như nhấp vào nút khác?
Đây là một cách xấu để đạt được những gì tôi đang tìm kiếm: nút xử lý sự kiện cho nút tiếp tục "đặt cờ ...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... và GetResults định kỳ thăm dò ý kiến:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Việc bỏ phiếu rõ ràng là khủng khiếp (bận rộn chờ đợi / lãng phí chu kỳ) và tôi đang tìm kiếm thứ gì đó dựa trên sự kiện.
Có ý kiến gì không?
Btw trong ví dụ đơn giản này, tất nhiên một giải pháp sẽ chia tách GetResults () thành hai phần, gọi phần đầu tiên từ nút bắt đầu và phần thứ hai từ nút tiếp tục. Trong thực tế, những thứ xảy ra trong GetResults phức tạp hơn và các loại đầu vào người dùng khác nhau có thể được yêu cầu tại các điểm khác nhau trong quá trình thực thi. Vì vậy, chia logic thành nhiều phương thức sẽ không tầm thường.
ManualResetEvent(Slim)
dường như không hỗ trợWaitAsync()
.