2011-04-12 4 views
0

저는 플러그인 기반 WPF 응용 프로그램에서 작업 중입니다. 플러그인은 다중 스레드를 사용하여 병렬로로드됩니다. 플러그인 중 하나는 WPF RibbonWindow를 사용하는 UI 플러그인입니다. RibbonTab을 플러그인 A에서 UI 플러그인에 추가하려고합니다.Dispatcher.Invoke를 사용하여 UI를 업데이트하는 데 문제가 있습니다.

호출 스레드가 RibbonWindow를 소유하지 않으므로 Dispatcher.Invoke를 RibbonWindow에 사용하고 있습니다. 불행히도 델리게이트 내부의 코드는 호출되지 않습니다. 응용 프로그램이 여전히 응답하지만 탭이 추가되지 않습니다.

어쨌든 다른 플러그인에서 UI 스레드에 액세스 할 수 있습니까? RibbonWindow에서 작동하도록 스레드를 사용할 수 있도록 응용 프로그램을 통해 모든 스레드를 유지할 수 있습니까?

System.Threading.ThreadStart start = delegate() 
     { 
      log.Debug(Thread.CurrentThread.ManagedThreadId); 

      if (!this.Dispatcher.CheckAccess()) 
      { 
       this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { 
        log.Debug(Thread.CurrentThread.ManagedThreadId); 
        ribbonRoot.Items.Add(myRibbonTab); 
       }); 
      } 
      else { 
       log.Debug("We have access add directly."); 
      } 

     }; 

     new Thread(start).Start(); 

추가 정보가 필요하면 알려주십시오.

감사합니다.

답변

0

리본 탭을 추가하려는 경우 더 이상 원하지 않는 한 이미 스레드를 시작할 필요가 없습니다 (이미 UI 스레드로 보내고 있습니다). 스레드에. 그렇다면 새로운 스레드를 만드는 대신 ThreadPool을 사용하는 것이 더 나을 수도 있습니다. 어쨌든, 이런 시나리오에서는 보통 Application.Current.Dispatcher에 직접 액세스하는 대신 플러그인 인터페이스를 통해 기본 창에서 Dispatcher을 플러그인으로 전달합니다. 캡슐화가 더 잘되고 단위 테스트에서 더 잘 제어 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 이제'System.Reflection.TargetInvocationException : 호출 대상에 의해 예외가 발생했습니다. ---> System.InvalidOperationException : 호출 스레드가 다른 스레드가 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다. 예외입니다. Dispatcher를 사용하여 리본 윈도우를 만들려고했는데 응용 프로그램을 응답하지 않게 만들었습니다. 제발 조언. – user26242

+0

Application.Current.Dispatcher를 사용하여 각 리본 탭을 만들어야 만하고 내 문제가 해결되었습니다. 도와 주셔서 감사합니다. – user26242

1

UI 스레드에서 호출하려면 Application.Current.Dispatcher이 필요합니다.

btw : 왜 ThreadStart로 전송하고 있습니까? (중요하지 않지만 호기심이없는 것)