SyncLock для AsyncOperation - PullRequest
       24

SyncLock для AsyncOperation

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

У меня есть метод Update (), который вызывается AsyncOperation через .Post (). Когда я помещаю MessageBox в эту функцию, я получаю несколько ящиков сообщений и пытаюсь понять, почему это происходит.

Окно сообщений должно остановить выполнение Update () до тех пор, пока не будет нажата кнопка «ОК», но из-за .Post () я получаю повторный вход в Update (), в результате чего следующее окно сообщений появляется до закрытия предыдущего. 1003 *

Моей первой мыслью было поместить SyncLock в Update (), чтобы он никогда не мог работать одновременно, но это не имело никакого эффекта. Когда я вывожу .ManagedThreadID в MessageBox, все вызовы имеют одинаковый идентификатор потока, поэтому кажется логичным, что SyncLock не имеет никакого эффекта, потому что он блокирует только разные потоки.

Так может кто-нибудь объяснить, что здесь происходит? Как один поток может одновременно выполнять одну и ту же функцию?

1 Ответ

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

Окно сообщения является модальным только в той ветке, в которой оно отображается. Поток пользовательского интерфейса в вашем случае, как и должно быть. Это не может помешать рабочим потокам вызывать Post (), поэтому вы продолжите получать больше сообщений. SyncLock также не может работать, он повторно входит в тот же поток. Простой логический флаг, который вы устанавливаете в true перед вызовом MessageBox.Show () и в false после того, как будете выполнять работу, не вызывайте Show снова, если для него установлено значение true.

Или просто не использовать MessageBox, Debug.Print () - хороший способ отследить. Текст отправляется в окно вывода по умолчанию. Точка останова отладчика тоже может творить чудеса.

...