.NET에서 스레드가 다른 스레드에 신호를 보내는 가장 좋은 방법은 무엇입니까?

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

  •  02-07-2019
  •  | 
  •  

문제

사용자가 실행을 중단하려면 다른 스레드에 신호를 보내야 하는데 신호/신호 확인 메커니즘을 구현하는 방법이 확실하지 않습니다.나는 내 프로젝트에 싱글톤을 갖고 싶지 않습니다(글로벌 프로젝트처럼). bool), 그런데 대안이 있나요?

~ 안에 이 스레드 사람들은 C++에서 이에 대한 적절한 구조를 제안하지만 .NET에서는 비슷한 구조를 모릅니다.누군가 좀 밝혀 주시겠습니까?

도움이 되었습니까?

해결책

시험해 보세요 배경작업자.진행 상황 업데이트 및 실행 중인 작업 취소를 지원합니다.

한 스레드가 다른 스레드가 해당 작업을 완료할 때까지 기다리도록 하려면 ManualResetEvent와 마찬가지로 Monitor.Wait 및 Monitor.Pulse가 좋습니다.그러나 이는 실제로 실행 중인 작업을 취소하는 데 전혀 사용되지 않습니다.

자신만의 취소 코드를 작성하려면 두 스레드가 모두 액세스할 수 있는 필드를 하나만 있으면 됩니다.휘발성으로 표시하세요. 예:

private volatile bool cancelling;

메인 스레드에서는 이를 true로 설정하고 작업자 스레드에서는 이를 주기적으로 확인하여 완료되면 false로 설정합니다.

세마포어 변수의 범위를 클래스 전용으로 제한할 수 있으므로 이는 실제로 '전역 변수'를 갖는 것과 비교할 수 없습니다.

다른 팁

조금 모호하지만(시간이 부족함) 살펴보세요 ManualResetEvent 및 AutoResetEvent.Monitor 및 lock 키워드를 찾아볼 수도 있습니다.

Monitor.Wait 및 Monitor.Pulse를 살펴보세요.다음은 .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