пятница, 3 июня 2016 г.

Особенности await в WinForms

Если попытаться запустить await функцию из из основного потока WinForms - то ничего не получиться - все скомпилируется, вызовется до await, после чего управление как и положено вернется в основной поток, но так как это не совсем простой поток - а основной поток GUI  у которого имеется SynchronizationContext - то await поток обратного вызова который рассматривался в предыдущем посте никогда не получит управления и приложение "зависнет":





поэтому самый правильный и очевидный путь обхода этого ограничения - запустить новый поток, в котором естественно не будет этого "ужасного" SynchronizationContext

Task t = Task.Run(() => AsyncAwaitTests.SampleAsync());

дальнейшее поведение будет как уже описывалось в  предыдущем посте . Если же нам надо получать какие-то данные в результате работы асинхронной функции то надо использовать следующее:




Комментариев нет :

Отправить комментарий