Partea cea mai buna la async/await este ca acest cod se scrie usor .Usurinta aceasta vine de la un State Machine ( vezi text sau video ) si care aduce penalitati de performanta daca nu e folosit cum trebuie (https://ayende.com/blog/174689/the-cost-of-the-async-state-machine )
Vreau sa discut despre un async/ await specific, pe Windows_Closing din WPF. Trebuia sa chem o functie async . Am zis, nimic mai usor:
private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
await MyFunc();
}
Acolo, desi pui async pe eveniment si await pe un functie ce ruleaza async, totusi aplicatia se inchide. De ce? As vrea sa stiu – probabil se inchide pe un thread separat.
Am zis, ok , pun e.Cancel=true la inceput si apoi pe false.
private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel=true;
await MyFunc();
e.Cancel=false;
}
Iar nu merge . Nu se mai inchidea.
Am zis, ok, il pacalesc cu scot async de pe eveniment si pun .Result()
private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
var t= MyFunc().Result;
}
Acum se bloca ( configureAwait, Cleary , https://msdn.microsoft.com/en-us/magazine/dn605875.aspx )
In disperare de cauza , am revenit la old good threads:
bool Cancel;
private void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
this.Title = "aaaa";
var _thread = new Thread(new ThreadStart(() => { Cancel = WaitMe(); }));
_thread.Start();
_thread.Join();
e.Cancel = Cancel;
}
bool WaitMe()
{
var x = WaitOneMinute().Result;
return !x;
}
async Task<bool> WaitOneMinute()
{
await Task.Delay(5 * 1000);
var res=MessageBox.Show("Close ?","Close application?",MessageBoxButton.OKCancel);
return res == MessageBoxResult.OK;
}
Si asa a mers…