Операция выполнена!
Закрыть
Хабы: C#, Windows

Мне сложно судить о практической ценности данного статьи, поскольку я уже весьма далек от .NET-разработки прикладных приложений, статья написана больше в исследовательских целях разгребания окаменелых кхм.. мамонта, и, возможно, кто-то из практикующих программистов найдет ее забавной.

На просторах мне не удалось обнаружить каких-либо упоминаний об этой проблеме, вскользь лишь исследователь Joe Duffy писал об этом в своем блоге. Еще косвенно было упоминание вот на этой google-борде. Отсутствие упоминаний об этом явлении должно говорить о околонулевой ценности исследования, но статья сама себя не напишет.

Речь пойдет об очень необычной причине дедлока GUI-потока в оконных приложениях .NET – WinForms и WPF. Когда такое приложение виснет намертво, разработчик ищет причину там, где привык: в собственных локах, в гонке между своими потоками, в неудачном lock или забытом .Wait(). Он перетряхивает свой код - и нередко не находит ничего криминального. Потому что причина лежит не этажом ниже, чем он смотрит, и даже не в подвале: в механизме, который он не писал, не видит и с которым, как ему кажется, вообще не работает.

Если вы работаете с WinForms/WPF, то вы наверняка знаете, что весь GUI-стек построен на однопоточной модели COM -  Single-threaded apartments: буфер обмена, drag-drop, общие диалоги, shell-интеграция, OLE - всё это STA-компоненты.

У WinForms сгенерированная точка входа Main имеет явный атрибут [STAThread] (видно прямо в шаблоне), у WPF точка входа генерируется автоматически и тоже имеет атрибут [STAThread].

Читать далее
Читайте также
НОВОСТИ

ПИШИТЕ

Техническая поддержка проекта ВсеТут

info@vsetut.pro