2014-04-23 3 views
0

여기에 문제가 있습니다. Add-in Express로 만든 Outlook 추가 기능이 있습니다. WPF 콘텐트가 실행되는 유일한 winforms ElementHost가있는 패널을 호스팅합니다. 이 WPF 컨트롤에는 텍스트 상자와 단추가 있습니다. 버튼 클릭 트리거 'RunWorkerCompleted'프로세스에서 데이터를로드하는 백그라운드 워커가이 데이터를 제어합니다. 버튼을 누르면 모든 것이 정상적으로 진행됩니다. 그러나 TextBox에서 'Enter'키를 누른 다음 BackgroundWorker를 트리거하면 'RunWorkerCompleted'가 주 스레드가 아닌 스레드 풀에서 실행되고 WPF 요소에 액세스 할 수 있습니다. 두 경우 모두 BackGroundWorker.RunWorkerAsync()가 주 스레드에서 호출되고 DoWork는 스레드 풀에서 실행되며 enter-key-catch의 경우에만 RunWorkerCompleted도 스레드 풀에서 실행됩니다.Add-in express 및 BackGroundWorker 스레딩

답변

0

Add-in Express에서 버그가 발생했습니다. 경우에 따라 System.Threading.SynchronizationContext.Currentnull으로 설정된 Add-in Express 이벤트 처리기가 호출됩니다. BackgroundWorkerRunWorkerAsync 메서드를 사용하여 UI 컨텍스트를 저장하면 문제가됩니다.

SynchronizationContext를 수정하려면 다음 해결 방법을 사용할 수 있습니다. 여기서 MyActionRunWorkerAsync을 호출하는 방법입니다.

var ctx = SynchronizationContext.Current; 
if (ctx != null) 
{ 
    MyAction(); 
} 
else 
{ 
    var timer = new DispatcherTimer(); 
    timer.Tick += (s, a) => 
    { 
     MyAction(); 
     timer.Stop(); 
     timer = null; 
    }; 
    timer.Interval = TimeSpan.FromMilliseconds(10); 
    timer.Start(); 
} 

또 다른 해결책은 정적 멤버 어딘가에 유효한 SynchronizationContext.Current 값을 저장 한 후 같은 목적을 위해 이벤트 처리기에서 SynchronizationContext.Post를 호출 할 것이다. 나는 이것을 시도하지 않았다.

+0

감사합니다. WPFElement.Invoke (() => {ui-related-code})' – user3270297