SyncLock для AsyncOperation
У меня есть метод Update(), который вызывается AsyncOperation через.Post(). Когда я помещаю MessageBox в эту функцию, я получаю несколько ящиков сообщений, и я пытаюсь понять, почему это происходит.
Окно сообщений должно прервать выполнение функции Update() до тех пор, пока не будет нажата кнопка "ОК", но из-за.Post () я получаю повторный вход в Update(), в результате чего следующее окно сообщений появляется до закрытия предыдущего.
Моей первой мыслью было поместить SyncLock в Update(), чтобы он никогда не мог работать одновременно, но это не имело никакого эффекта. Когда я вывожу.ManagedThreadID в MessageBox, все вызовы имеют одинаковый идентификатор потока, поэтому кажется логичным, что SyncLock не действует, потому что он блокирует только разные потоки.
Так может кто-нибудь объяснить, что здесь происходит? Как один поток может выполнять одну и ту же функцию одновременно?
1 ответ
Окно сообщения является модальным только в той ветке, в которой оно отображается. Поток пользовательского интерфейса в вашем случае, как и должно быть. Это не может помешать рабочим потокам вызывать Post(), поэтому вы продолжите получать больше сообщений. SyncLock также не может работать, он повторно входит в тот же поток. Простой логический флаг, который вы устанавливаете в true перед вызовом MessageBox.Show() и в false после того, как будете выполнять работу, не вызывайте Show снова, если для него установлено значение true.
Или просто не используя MessageBox, Debug.Print() является хорошим способом для отслеживания. Текст отправляется в окно вывода по умолчанию. Точка останова отладчика тоже может творить чудеса.