WPF-C # Синхронизация потоков ThreadPool - PullRequest
2 голосов
/ 07 марта 2011

У меня есть дизайн кода следующим образом. Поток GUI делает три ThreadPool.QueueUserWorkItem вызова. Третий вызов ожидает окончания первых двух вызовов, используя AutoResetEvents. Однако, когда один из двух потоков выдает исключение, я хочу, чтобы третий поток завершился, а элемент управления вернулся в поток GUI. Любые идеи о том, как я могу сделать это?

Ответы [ 4 ]

1 голос
/ 07 марта 2011

Что не так с установкой событий не только когда потоки заканчиваются, но и когда они выдают исключение?

0 голосов
/ 07 марта 2011

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

0 голосов
/ 07 марта 2011

Почему бы вам не использовать Parallel Task Library , чтобы синхронизировать ваши потоки и выполнить результат через поток диспетчера, сохранив ссылку на диспетчер в одной из ваших задач, а затем используйте Dispatcher.BeginInvoke для выполнения последнего шага в потоке пользовательского интерфейса?

0 голосов
/ 07 марта 2011

Просто используйте одно событие автоматического сброса, которое устанавливается, когда завершается какой-либо поток (либо нормально, либо с исключением). Имеют две целочисленные переменные (общие для всех потоков): threadCompletedNormallyCount и threadCompletedAbnormallyCount. Когда поток завершает, он увеличивает одну из этих двух переменных, используя Interlocked.Increment, чтобы указать, как он завершил, а затем устанавливает событие.

Когда третий поток просыпается, он может проверить эти переменные, чтобы увидеть, нужно ли ему выйти (то есть оба потока завершились нормально или хотя бы один ненормально, хотя что вы собираетесь делать с незавершенным потоком в последнем случае?) , Если только один поток завершил нормально, он должен снова спать.

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