Это по замыслу.CLR соблюдает договор однопоточной квартиры (STA).Основным потоком приложения с графическим интерфейсом является STA, как требуется для программирования Windows, атрибут [STAThread] в методе Main () гарантирует, что.
Жесткие правила для потока STA заключаются в том, что он должен прокачать цикл сообщений.(как Application.Run) и никогда не сможет заблокировать.Блокировка потока STA с большой вероятностью может привести к взаимоблокировке, когда фоновые потоки используют какие-либо потоковые объекты COM-квартиры.Их много, буфер обмена и WebBrowser являются общими, которые вы встречаете в программе .NET.Также много менее видимых, доступных как классы-оболочки .NET.
CLR гарантирует, что блокировка не может вызвать взаимоблокировку, закачивая цикл сообщений, когда вы используете оператор блокировки или вызываете метод Wait классов синхронизации.Или Thread.Join ().Этот цикл сообщений отправляет сообщение WM_PAINT, в результате чего запускается событие Paint.
Вам необходимо реструктурировать свою программу, чтобы убедиться, что это не вызывает проблем.Очень важно сосредоточиться на том, чтобы вообще не блокировать основной поток.Это очень редко требуется, например, когда у вас есть класс BackgroundWorker или Control.BeginInvoke ().По какой-то странной причине класс Mutex не делает такого рода прокачку, это может быть другим способом.Хотя тупик скрывается за углом, если вы делаете.