2012-09-07 2 views
2

.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에서 모든 변수 액세스가 휘발성으로 처리되므로 이해할 수 있으므로 충분히 안전하다고 생각합니다.

+0

코드를 작동하는 방식을 더 잘 이해하기 위해이 문제를 게시 할 필요는 없습니다. 그것이 우리가하는 일을하는 이유입니다. – ctacke

답변

2

나는 적어도이 같은 Dequeue 전화, 뭔가 주위에 잠금을해야한다고 동의 할 거라고 :

lock(m_progressQueue.SyncRoot) 
{ 
    ProgressChangedEventArgs args = this.m_progressQueue.Dequeue(); 
} 

그리고 그것은 아마도 클래스의 나머지 부분에서 사용할 수 있습니다.

+0

Chris 님, 안녕하세요. 나는 * BackgroundWorker-ish * 루틴을 뒤로 썼지 만 확실히 ProgressChangedEventArgs의 대기열을 사용하지는 않았다. 나는 이것을보고 그것 뒤에있는 논리를 이해하려고 노력하고있다. 왜 이렇게했는지에 대한 정보를 제공해 주시겠습니까? – jp2code

+0

대기열을 통해 ReportProgress는 2 가지 작업을 수행 할 수 있습니다. 1) 진행 상황을 UI 스레드로 마샬링하고 2) 모든 진행 핸들러가 작업을 수행하는 동안 호출자를 차단하지 않습니다. – ctacke

+0

답변 해 주셔서 감사합니다. Follow-up, 나는 Application.DoEvents에 대해 궁금합니다. 이 스레드가 UI 스레드를 차단하지 않기 때문에 엄격하게 필요하지는 않습니까? 또한, 항상 외부 스레드에서 UI 메시지 펌프를 펌프 할 수 있는지 궁금해했습니다 ... 저는 항상 UI가 아닌 스레드의 호출을 무시한다고 가정했습니다. – tcarvin

관련 문제