2009-11-09 5 views
0

멀티 태스킹을 위해 thread/dispatcher를 사용하려는 두 가지 방법은 다음과 같습니다. 아무에게나 좋은 제안이 있는지 궁금합니다.WPF 스레딩 질문 더 나은 옵션

발췌문 1 :

Thread t = new Thread(new ThreadStart(delegate 
       { 
        MyMethod(); 
       })); 
t.IsBackground = true; 
t.Start(); 
t.Join(); 

코드 조각 2 :

Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
      (dummyDelegate)delegate 
      { 
       MyMethod(); 

      } 
    ); 

알려 주시기 바랍니다. 감사합니다. N

+0

원래 포스터는 this.Dispatcher.Invoke를 사용하여 스 니펫 2에서이 객체가 속한 UI 스레드에서 코드를 실행하려고 했습니까? Dispatcher.CurrentDispatcher를 사용하면 코드가 동일한 스레드에서 동시에 실행됩니다. – Anton

답변

0

아무것도 BackgroundWorker?

여전히 WPF에서 사용할 수 있도록 특정 윈폼 아닙니다.

2

둘 다 "더 우수"하지 않습니다. 둘 다 다릅니다.

첫 번째 예제는 백그라운드 스레드에서 MyMethod를 실행합니다. MyMethod가 예를 들어 네트워크 활동이나 계산 집약적 인 일을 차단하면 UI 스레드가 차단되지 않고 UI가 응답 성을 유지합니다. (샘플 코드가 차단되고 대기하기 때문에 현재이 이점을 잃어 버리고 있습니다.) 단점은 MyMethod가 UI를 읽거나 업데이트하려는 경우 마이너마치를 뛰어 넘어야한다는 것입니다.

두 번째 예제는 UI 스레드에서 MyMethod를 실행합니다. 이렇게하면 MyMethod가 UI 요소의 제한없이 상호 작용할 수 있지만 MyMethod가 실행되는 동안 UI가 고정되어 MyMethod가 오래 걸리면 부적절합니다.

그래서 MyMethod의 기능에 따라 다릅니다. MyMethod가 몇 가지 UI 요소를 업데이트 한 다음 종료하면 두 번째 옵션을 사용하십시오. MyMethod가 파일을로드하거나 데이터를 다운로드하거나 긴 계산을 수행하는 경우 첫 번째 파일을 사용하십시오.

1

세 번째 옵션이 있습니다. 스레드 풀을 사용하여 수명이 짧은 비동기 호출을 실행합니다. 예 :

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context) 
    { 
     // context is unused 
     MyMethod(); 
    }); 

이렇게하면 스레드 풀의 스레드를 사용하여 MyMethod를 실행합니다. 메서드가 완료되면 스레드가 풀로 반환됩니다. 이 방법의 장점은 스레드의 수명을 직접 관리 할 필요가 없으며 스레드를 만들고 파괴 할 때 메모리와 성능 오버 헤드가 발생하지 않는다는 것입니다. 연로를 사용하여 문제