저는 플러그인 기반 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();
추가 정보가 필요하면 알려주십시오.
감사합니다.
답장을 보내 주셔서 감사합니다. 이제'System.Reflection.TargetInvocationException : 호출 대상에 의해 예외가 발생했습니다. ---> System.InvalidOperationException : 호출 스레드가 다른 스레드가 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다. 예외입니다. Dispatcher를 사용하여 리본 윈도우를 만들려고했는데 응용 프로그램을 응답하지 않게 만들었습니다. 제발 조언. – user26242
Application.Current.Dispatcher를 사용하여 각 리본 탭을 만들어야 만하고 내 문제가 해결되었습니다. 도와 주셔서 감사합니다. – user26242