Каков наилучший способ заставить поток сигнализировать о другом потоке в .NET?

StackOverflow https://stackoverflow.com/questions/115928

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Проверять ФонРабочий.Он поддерживает обновления хода выполнения и отмену выполняемой задачи.

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

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

private volatile bool cancelling;

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

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

Другие советы

Немного расплывчато (недостаточно времени), но посмотрите ManualResetEvent и AutoResetEvent.Вы также можете найти ключевое слово Monitor и lock.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top