2011-11-23 2 views
2

.Net 4.0 WPF를 사용하여 개발 된 Outlook 2007 용 VSTO 추가 기능이 있습니다. 배포 된 PC 중 하나 인 UI에 문제가 있습니다. 경우에 따라 UI가 잠시 동안 반응하지 않게됩니다. 클릭이 작동하지 않습니다. 잠시 후 모든 것이 정상으로 돌아가고 사용자는 버튼을 클릭 할 수 있습니다. PC에 설치된 다른 추가 기능은 - SnagIT 및 Google 데스크톱 Outlook 툴바입니다.VSTO WPF Outlook Addin - 무작위로 반응이없는 UI

이런 종류의 문제에 대한 의견이 있으면 도움을주세요.

답변

-1

작업이 완료 될 때까지 UI를 고정시키는 UI 스레드에서 작업하는 것처럼 들립니다. UI와 관련이없는 작업을 수행하려면 Tasks 라이브러리를 사용해야합니다. UI를 업데이트해야하는 Task을 사용하여 작업하는 경우 WPF Dispatcher을 사용해야합니다.

+0

워드 추가 기능 - 나는 확실히 WPF의 UI 스레드에서 모든 작업을 수행하고 있지 않다 - 나는 의심 저자도 마찬가지다. - Outlook/Word (기타)가 UI 스레드에서 작업을 수행하고 WPF가 응답하지 않을 가능성이 높습니다. 이 문제를 방지하는 방법에 대한 자세한 VSTO 관련 답변이 필요합니다. – BrainSlugs83

+0

@ BrainSlugs83 혹시이 문제를 해결 했습니까? 나는 똑같은 문제에 직면하고있다. – Nikhil

1

Word Add-In에서 동일한 문제가 발생했습니다. 매우 까다로운 개발자 상자에서 백그라운드로 모든 작업을하고 있지만 UI가 잠겨 있습니다. 그래서 즉, 새로운 Thread (에 Window 객체를 인스턴스화 -

내 이론은 내가 백그라운드 스레드에서 호출에도 불구하고 말씀이

나는 실험을 시도 등, UI 스레드에서 일을하고 있다는 것입니다 내 UI 스레드는 Word의 작업자 스레드와 동일한 스레드가 아닙니다.) - 작동했습니다. 내 UI가 더 이상 임의의 간격으로 잠기지 않습니다.

스레드가 닫히기 전에 COM 개체의 인스턴스를 제거하고 스레드 간 COM 액세스 (특히 RC 호스트에 액세스 할 때 Dispatcher.Invoke를 Office 호스트 응용 프로그램의 스레드로 잠재적으로 사용)에주의하십시오. . 다시 Dispatcher.Invoke 경우 : -

주) ... 디스패처는가 인스턴스화하고있는 스레드와 연관된, 그래서 당신은 단지 등 사무실 호스트 응용 프로그램의 콜백에서 디스패처를 인스턴스화 할 것 다음과 같이 Thread.Join을 호출하는 스레드에 사용할 수 없습니다. (이 경우, 응용 프로그램 이벤트, Thread.Sleep 및 Thread.Yield를 처리해야합니다.) 그렇지 않으면 교착 상태가 발생합니다. 여기

는 genericized 예를 들어 내가 뭘하는지 버전입니다 : 내가 가진 동일한 문제가

// This approach makes WPF Windows an order of magnitude more responsive 
Thread t = new Thread(() => 
{ 
    try 
    { 
     // Implement the IDisposable pattern on your window to release 
     // any resources before the thread exits 
     using (var myWindow = new MyWindow()) 
     { 
      // Do any other pre-display initialization with the myWindow 
      // object here... 

      myWindow.ShowDialog(); 
     } 
    } 
    finally 
    { 
     // Strongly Recommended (not doing this may cause 
     // weird exceptions at application shutdown): 
     Dispatcher.CurrentDispatcher.InvokeShutdown(); 
    } 
}); 

t.SetApartmentState(ApartmentState.STA); // Required 
t.IsBackground = false; // Recommended 

t.Start(); // Kicks off the new UI thread 
t.Join(); // Blocks execution until the new UI thread has finished executing... 
관련 문제