.NET Compact Framework 용 OpenNETCF SDF BackgroundWorker 구현 내에서 코드를보고 있었으며 다음 코드가 스레드로부터 안전하지 않은 것처럼 보입니다. 그러나 스마트 장치 프레임 워크는 오랫동안 사용되어 왔기 때문에 무엇을 놓치고 있습니까? 이 스레드로부터 안전합니까? 그렇다면 이유는 무엇입니까?Compact Framework에서 BackgroundWorker 구현
자습서를 무료로 사용할 수 있더라도 전체 수업을 게시하지 않으므로 고객이 SDF에 라이센스 비용을 지불해야한다는 점에 유의하십시오. 자위대 팀 중 누군가가이 교육적 발췌조차도 반대한다면 즉시 질문을 풀 것입니다.
private void ProgressDispatcherProc()
{
this.m_stopThreads = false;
while (!this.m_stopThreads)
{
while (this.m_progressQueue.Count > 0)
{
MethodInvoker method = null;
ProgressChangedEventArgs args = this.m_progressQueue.Dequeue();
if (this.ProgressChanged != null)
{
if (method == null)
{
method =() => this.ProgressChanged(this, args);
}
this.m_guiMarshaller.BeginInvoke(method);
Application.DoEvents();
}
}
Thread.Sleep(this.WorkerReportsProgress ? 5 : 0x3e8);
}
}
가변 m_progressQueue
표준 System.Collections.Generic.Queue <>이다
이것은 UI 스레드에서이를 호출하는 메소드를 호출 대기를 해제 백그라운드 쓰레드이다.
내 관심사는 큐를 보호하기위한 잠금이 없다는 것입니다.이 큐는 한 스레드에 대기열에 있고 대기열에서 대기열에 있습니다. while (!this.m_stopThreads)
에서 수행 된 간단한 부울에 대한 루핑 .NET Compact Framework에서 모든 변수 액세스가 휘발성으로 처리되므로 이해할 수 있으므로 충분히 안전하다고 생각합니다.
코드를 작동하는 방식을 더 잘 이해하기 위해이 문제를 게시 할 필요는 없습니다. 그것이 우리가하는 일을하는 이유입니다. – ctacke