Каков наилучший способ заставить поток сигнализировать другому потоку в .NET? - PullRequest
10 голосов
/ 22 сентября 2008

Мне нужно, чтобы поток сигнализировал другому, если пользователь хочет прервать выполнение, однако я не уверен, как реализовать механизм сигнализации / проверки сигнала. Я не хотел бы иметь в своем проекте синглтон (например, глобальный bool), но есть ли альтернатива?

В этой теме люди предлагают подходящие структуры для этого в C ++, но я не знаю ничего подобного в .NET. Может ли кто-нибудь пролить свет?

Ответы [ 6 ]

7 голосов
/ 22 сентября 2008

Попробуйте BackgroundWorker . Поддерживаются обновления хода выполнения и отмена запущенной задачи.

Если вы хотите, чтобы один поток ожидал, пока другой поток завершит свою работу, то Monitor.Wait и Monitor.Pulse хороши, как и ManualResetEvent. Тем не менее, они на самом деле бесполезны для отмены запущенной задачи.

Если вы хотите написать свой собственный код отмены, вы можете просто где-то иметь поле, к которому имеют доступ оба потока. Отметьте это как изменчивое, например:

private volatile bool cancelling;

Сделайте так, чтобы основной поток установил для него значение true, и чтобы рабочий поток периодически проверял его и устанавливал для него значение false, когда он закончил.

Это на самом деле не сравнимо с наличием «глобальной переменной», поскольку вы все еще можете ограничить область действия переменной семафора, чтобы она была закрытой для класса.

5 голосов
/ 22 сентября 2008

Немного расплывчато (не хватает времени), но посмотрите на ManualResetEvent и AutoResetEvent . Вы также можете посмотреть монитор и заблокировать ключевое слово.

3 голосов
/ 22 сентября 2008

Посмотрите на Monitor.Wait и Monitor.Pulse. Вот отличная статья о потоках в .Net (очень читабельная): http://www.albahari.com/threading/part4.aspx

1 голос
/ 22 сентября 2008

Это зависит от того, какая синхронизация вам нужна. Если вы хотите иметь возможность запускать поток в цикле до тех пор, пока не будет достигнут какой-либо конец выполнения - все, что вам нужно, - это статическая переменная bool. Если вы хотите, чтобы один поток ожидал, пока другой поток достигнет точки выполнения, вы можете использовать WaitEvents (AutoResetEvent или ManualResetEvent). Если вам нужно дождаться нескольких waitHandles, вы можете использовать WaitHandle.WaitAll или WaitHandle.WaitAny.

1 голос
/ 22 сентября 2008

Простое решение, такое как синхронизированное статическое логическое значение, должно быть всем, что вам нужно, в отличие от решения на основе фреймворка, которое может быть излишним для вашего сценария. Если вам все еще нужна инфраструктура, посмотрите на параллельные расширения .NET для идей.

0 голосов
/ 22 сентября 2008

Посмотрите на пространство имен System.Runtime.Remoting.

...