Di aplikasi metro C # / XAML saya, ada tombol yang memulai proses yang sudah berjalan lama. Jadi, seperti yang disarankan, saya menggunakan async / menunggu untuk memastikan utas UI tidak diblokir:
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)
...
}
Kadang-kadang, hal-hal yang terjadi di dalam GetResults akan membutuhkan input pengguna tambahan sebelum dapat melanjutkan. Untuk kesederhanaan, katakanlah pengguna hanya perlu mengklik tombol "lanjutkan".
Pertanyaan saya adalah: bagaimana saya bisa menunda eksekusi GetResults sedemikian rupa sehingga menunggu acara seperti klik tombol lain?
Inilah cara yang jelek untuk mencapai apa yang saya cari: pengendali acara untuk tombol "lanjut menetapkan tanda ...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... dan GetResults melakukan polling secara berkala:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Pemungutan suara jelas mengerikan (menunggu sibuk / buang-buang siklus) dan saya sedang mencari sesuatu yang berbasis acara.
Ada ide?
Btw dalam contoh sederhana ini, satu solusi tentu saja untuk membagi GetResult () menjadi dua bagian, memanggil bagian pertama dari tombol mulai dan bagian kedua dari tombol melanjutkan. Pada kenyataannya, hal-hal yang terjadi di GetResults lebih kompleks dan berbagai jenis input pengguna dapat diperlukan pada titik yang berbeda dalam eksekusi. Jadi memecah logika menjadi beberapa metode akan menjadi non-sepele.
ManualResetEvent(Slim)
sepertinya tidak mendukungWaitAsync()
.