2012-10-15 6 views
2

나는이 우연히 유지해야한다 :빈 Delegate로 ThreadStart를 호출하는 이유는 무엇입니까? 오래된 응용 프로그램의 일부 법의학 고고학 조사를하는 동안

은 최근 .NET 4.0로 변환 된 WPF 응용 프로그램이며,이 코드는 배경 노동자

  if(bgWorker1.IsBusy || bgWorker2.IsBusy) 
      { 
       Thread.Sleep(100); 
       Application.Current.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Background, 
        new System.Threading.ThreadStart(delegate { }) 
       ); 
      } 
내에서 실행

1 - 노프 (no-op) 대리인이있는 스레드 (주 gui)를 호출하여 발생할 수있는 부작용은 무엇입니까? 다른 두 스레드는 또한 메인 GUI 스레드에서 호출을 수행하지만이 중 하나만 우선 순위를 설정합니다 (이들은 TreadStart가 아닌 Action을 사용합니다).

2 - 이상하게도이 응용 프로그램의 교착 상태와 유사한 경우가 있는데, 이것이 원인 일 수 있다고합니다. (아무런 이유없이 우선 순위와 메인 GUI 스레드를 중심으로).

감사

+0

내게 무의미 해 보입니다 ... – japreiss

+0

메인 스레드가 메시지를 처리 ​​할 때까지이 호출은 아마도 차단 될 것입니다. – CodesInChaos

답변

3

이 스레드는 호출 기능은 Dispatcher의 스레드 수 "프로세스"를 (NO-OP) 대표까지 차단하게됩니다.

이것은 좋은 습관이 아니므로 제거해야합니다. I 용의이 목표는 (세 번째) BackgroundWorker의 완료 이벤트가 처음 두 개가 완료되었을 때의 신호가되도록 허용하는 것이 었습니다.

일반적으로 이와 같은 완료를위한 회전은 일반적으로 잘못된 디자인의 표시입니다. 훨씬 더 좋은 디자인은 CountdownEvent을 사용하는 것입니다. 이는 완료시 모두 BackgroundWorker 인스턴스로 신호를 보낼 수 있습니다.

그러면 Thread.Sleep 및 발송자 호출로 반복하는 대신 카운트 다운 이벤트를 기다릴 수 있습니다.

+0

그래서 제대로 이해하면 기본적으로 Dispatcher의 스택에 정렬 책갈피를 설정하고 책갈피에 도달하여 처리 될 때까지 스레드를 중단합니다. 나는 이것이 Side Effect Oriented Programming이 어떻게 생겼을 것인가에 가까워 졌다고 생각한다. – Newtopian

+0

@Newtopian 네 - 일종의. Dispatcher가 델리게이트 (아무 것도하지 않음)를 실행할 때까지 차단되므로, 이것은 실제로 프로그래밍에 의한 부작용입니다. –

2
  1. "What possible side-effect would be acheived by [...]"Invoke을 사용하기 때문에하지 BeginInvoke 그것은 차단 호출 될 것입니다. 즉, 백그라운드 스레드가 아무 작업 대리자도 실행될 때까지 계속 실행되지 않습니다. 결과는이 noop이 실행되기 전에 메시지 루프에 대기중인 모든 것이 완료 될 때까지 코드가 계속되지 않는다는 것입니다.
  2. "I have cases that strangely resembles deadlock with this application and something tells me that this could be the cause." 나에게 그럴듯한 소리. 이 코드 블록은 나쁜 습관과 가능한 교 착 위치에 대해 비명을 지른다. 코드가 배경 근로자 인 을 참조하고 있기 때문에 다른 사람들이 유사한 작업을 수행하고있는 것일 수 있습니다.

는 지금, 뭔가가 잘못된 것이 분명 보이지만, 거기에 무슨 일이 일어나고 있는지에 대한 자세한 내용을 알고하지 않고는 해결 될 수있는 방법에 대해 언급을 오히려 어렵다. 내 추측으로는 근본적인 설계 결함으로 인해 취해진 접근법이 있습니다.

+0

덕분에, 나는 해결책을 찾고 있지는 않았지만 그 코드는 목적이 무엇인지에 관해 정말로 나를 괴롭혔다. 감사. 많은 도움이됩니다. – Newtopian