Показаны сообщения с ярлыком Отладка. Показать все сообщения
Показаны сообщения с ярлыком Отладка. Показать все сообщения

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

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

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



четверг, 2 июня 2016 г.

Ограничения для Async - где нельзя применять !



Async применять нельзя в/для :

  • функции - точке входа программы ( функция Main не может быть async)
  • конструкторе класса, property get/set методы, и методы для event add/remove
  • функции с параметрами out / ref
  • никаких await в catch, finally и unsafe блоках ( начиная с C# 6 - можно в catch, finally )
  • также нельзя использовать в блокировках lock или Monitor Enter/Exit
    • вместо этого используйте SemaphoreSlim.WaitAsync
  • в запросах (например linq) await можно использовать только
    • в первой коллекции from или join

Асинхронные функции C# - как работает await/async

Префикс await по сути своей создает отдельный поток (№13 в нашем случае), который ставиться в пул CLR и ожидает когда основной поток ( №10) передаст ему управление:



вторник, 19 августа 2014 г.

Multithreading debuging - naming threads

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