한 스레드 (thread2)에서 값을 변경했습니다.부울 값을 두 스레드간에 동기화 유지
CheckSuccess = false;
이제 메인 스레드 (thread1 - GUI/양식)하지 픽업 변화는, 어떻게 모든 스레드 주위에 "전달 될"변경 가능한 것입니까?
나는 스레드 그것은 Race Condition처럼 보인다한 스레드 (thread2)에서 값을 변경했습니다.부울 값을 두 스레드간에 동기화 유지
CheckSuccess = false;
이제 메인 스레드 (thread1 - GUI/양식)하지 픽업 변화는, 어떻게 모든 스레드 주위에 "전달 될"변경 가능한 것입니까?
나는 스레드 그것은 Race Condition처럼 보인다, 데이터를 조작 (그렇게 말하지 않는 한) 별도의 인스턴스에서 작동하지 말아야 인상이었다. 이것을 피하려면 공유 변수에 대한 액세스를 동기화해야합니다.
volatile
키워드로 표시해보십시오.CheckSuccess
만약 당신이 lock() statement을 사용할 수 있습니다 (메서드 호출로 변환됩니다) 속성입니다 : UI 컨트롤의 속성입니다
private static readonly object stateLock = new object();
lock (stateLock)
{
// access a shared variable here
CheckSuccess = false;
}
CheckSuccess
경우 당신은 작업자 스레드에서 변경하려는 - WPF의 WinForms를 사용하고있는 프레임 워크에 따라 특별한 기술을 사용하여 변경 사항을 작업자에서 UI 스레드로 푸시해야합니다.
PS : 당신이 쓰는 값을 읽는 여러 스레드와 몇 스레드가있는 경우은 또한 (기본적으로 쓰기보다 더 자주 읽고) 유용 할 수 있습니다. ReaderWriterLock
아니요 예 : Exchange과 같은 인터 로킹 된 방법을 사용하십시오. 이것은 잠금 객체를 사용하는 것보다 훨씬 간단하며 원자적일 수 있습니다.
문제는 대부분 CPU 레지스터에서 부울 값 캐싱을 일으키는 컴파일러 최적화입니다. volatile
으로 신고하면 문제를 해결할 수 있습니다.
[휘발성]으로 표시되어 있습니까 (http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx)? – oleksii
주 스레드가 적극적으로 부울을 모니터링합니까 아니면 변경된 것을 어떻게 든 인식합니까? – Dykam
backgroundworker는이를 처리하기 위해 Completed 및 ProgressChanged 이벤트를 제공합니다. –