Почему незаконная перекрестная резьба * не * обнаруживается? - PullRequest
2 голосов
/ 19 октября 2011

Все:

Я создал форму Windows и кнопку. В другой теме я пытаюсь изменить текст кнопки, и она вылетает; но если я попытаюсь изменить цвет кнопки, это надежно удастся. Я думал, что если вы измените какое-либо свойство Windows Form Control, оно будет зависать. Может кто-нибудь сказать мне, что происходит?

Вот мой код, который не вылетает в закомментированной строке (но я думал, что это должно):

Thread thr = new Thread(() => { 
    //myButton.ForeColor = Color.Purple; // this never causes a crash :=(
    myButton.Text = Color.Purple.ToString(); // this always causes a crash.
}); // 
thr.Start();

Любые идеи будут оценены!

Michael

Ответы [ 3 ]

6 голосов
/ 19 октября 2011

Установщик свойства Control.ForeColor вызывает метод Invalidate (). Который является потокобезопасным в Windows. Он просто устанавливает бит состояния «это окно должно быть перекрашено» во внутреннем состоянии окна. На самом деле с окном ничего не происходит до тех пор, пока не будет запущено событие Paint. В потоке пользовательского интерфейса.

Winforms содержит явный код для подавления исключения.

Другие примеры читают свойство Text (не пишут). И документированные, InvokeRequired, BeginInvoke, EndInvoke, Invoke и CreateGraphics. Вот и все.

0 голосов
/ 19 октября 2011

Документация говорит:

Небезопасно вызывать элемент управления из потока, отличного от того, который создал элемент управления, без использования метода Invoke.

Бегать по улице небезопасно, не посмотрев первым.Вы не всегда попадете под машину, но ваши шансы довольно высоки.

Это исключение надежно происходит во время отладки и, при некоторых обстоятельствах, во время выполнения.Это исключение может появиться при отладке приложений, написанных с помощью .NET Framework до версии .NET Framework версии 2.0.Настоятельно рекомендуется исправить эту проблему, когда вы ее видите, но вы можете отключить ее, установив для свойства CheckForIllegalCrossThreadCalls значение false.

0 голосов
/ 19 октября 2011

это надежно удаётся

Не тратьте свою удачу слишком далеко.Рано или поздно это рухнет.Всегда выполняйте изменения в потоке GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...