나는 어떤 이유로 BackgroundWorker
교체를 구현하고있어, 나는 공용 속성 다음 구현해야한다 :공용 속성을 스레드로부터 보호하려면 어떻게해야합니까?
public bool CancellationPending { get; private set; }
public bool IsBusy { get; private set; }
public bool WorkerReportsProgress { get; set; }
public bool WorkerSupportsCancellation { get; set; }
난 당신이 그들이 BackgroundWorker
에서 봉사 무슨 목적을 알고 확신합니다. 그래서 그들은 다른 스레드에 의해 접근/수정 될 수 있습니다. 다중 스레딩을 "보호"하는 방법에 대해 우려하고 있습니다. volatile
으로 충분하다고 생각했지만 자동 속성에는 volatile
을 적용 할 수 없습니다.
어떻게해야합니까? 이러한 속성에 대한 비공개 필드를 만들고이를 volatile
이라고 선언해야합니까? 또는 각각 get
및 set
블록 안에 lock
을 넣어야합니까?
이것은 매우 일반적인 시나리오 작성 속성 (선호 자동 속성)이 스레드로부터 안전해야한다고 생각합니다. 이 예제에서는 모든 속성이 원자 유형입니다.
편집 :
내가 필요한 것을 명확히하기 위해 : 나는 모든 스레드가 항상 재산의 최신 값을 읽을 수 있는지 확인해야합니다. 이 참조 : https://stackoverflow.com/a/10797326/1081467
를 그래서 다시 volatile
, 또는 lock
보내고, 또는 다른 것을 사용하여 당신에게 조언을 할 수 있습니다 .. 최대 - 투 - 읽기 (그래서에만 두 번째 문제는 남아, 자성이 보장 된 bool
속성을 사용하는 경우? 날짜 값), 어떻게 이것을 정확하게 풀 수 있습니까? 비 프리미티브 타입의 속성을 가질 때는 어떻습니까? 각각 get
및 set
블록에 lock
초를 넣었습니까?
'BackgroundWorker' 클래스를 사용할 수 없습니까? –
각'get'과'set' 블록 안에'locki'ng을 사용하십시오. 또는 형식을 변경할 수 없게하십시오. 예를 들어,'CancellationPending'에는 문제가 없을 것 같습니다. – Oded
이 문맥에서'thread safe'가 정확히 무엇을 의미합니까? – asawyer