2011-10-13 4 views
1

이 방법으로 코드를 작성하는 것이 안전합니까?스레드 안전성에 대한 조언이 필요합니다.

 var form = new Form(); 

     Action callback = 
      () => 
       { 
        // do something 1 
       }; 

     ThreadPool.QueueUserWorkItem(
      args => 
       { 
        // do something 2 
        form.BeginInvoke(callback); 
       }); 

UPD "폼"변수에 대한 액세스 안전에 대해 우려하고 있습니다. 백그라운드 스레드에서 BeginInvoke 메서드를 사용합니다. 나는이 순간 이전에 어떤 읽기/쓰기 재주문도 없을 것이라고 확신 할 수 있습니까? (잠재적으로 "폼"변수를 배경 스레드의 관점에서 일관성없는 상태로 남겨 둘 수 있음)

답변

3

예, 괜찮아 보입니다. 변수 form이 캡처되고 ThreadPool에서 작업이 실행될 때 null이 아닌 한 작업해야합니다.

그러나 많은 세부 사항을 생략 했으므로이 코드는 모두 1 가지 방법으로 가정합니다.

// do something 1은 GUI를 액세스 할 수 없습니다. // do something 2 수 없습니다. 실제로 여기에서 발생하는 컴파일러 무엇

1
ThreadPool.QueueUserWorkItem(
args => 
{ 
    // do something 2 
    form.BeginInvoke(x); 
}); 

당신을 위해 새로운 클래스를 생성하고 그 안에 당신의 Form 인스턴스를 유지하는 멤버 변수가있다. 이 클래스는 new'd up 된 다음 ThreadPool.QueueUserWorkItem()으로 전달됩니다. 그래서 예, 스레드로부터 안전합니다.

관련 문제