2012-02-08 3 views
1

느린 메소드를 별도의 스레드에서 실행하고 싶습니다. 이 메서드는 응용 프로그램의 주 스레드에서 만든 COM 개체에 대한 호출을 사용합니다. 그는 WinFormsHost에, 나는 '뷰어'WPF 응용 프로그램에서이 일을하고 있어요 중요한 경우메인 스레드에서 생성 된 COM 객체를 사용하는 블로킹없이 코드 실행

var bwImg = image.GetBitonalImage(); // <- slow image is a COM created in main thread 
viewer.Document = bwImg; // <-- ATL control accepting the B/W COM image 

:

속도가 느린 코드를 가정 할 수 있습니다 것은 이것이다.

나는이 일을하는 것은이 비동기를하고 응용 프로그램의 실행을 차단하지 않을 것이라고 가정 :

var t = new Thread((ThreadStart)(() => 
{ 
    var bwImg = image.GetBitonalImage(); // <- this is in separate thread 
    Dispatcher.Invoke((Action)(() => 
    { 
     viewer.Document = bwImg; // <- this again on the main 
    })); 
})); 
t.Start(); 

이미지가 약간 나중에 표시됩니다 것을 나에게 괜찮습니다, 나는 어떻게 상관 없어 훨씬 나중에.

그러나 응용 프로그램이 동일한 방식으로 차단되는 경우가 발생합니다. 프로파일 링을했는데 실제로는 대부분의 시간이 GetBitonalImage에 사용되고 'viewer.Document = bwImg'에는 거의 쓰이지 않습니다.

코드를 모두 제거하면 앱이 반응하므로 다른 코드 오류는 발생하지 않습니다.

나중에 동일한 코드 COM 개체 (B/W 결과가 아니라 원본)를 사용하는 다른 코드가 있습니다.

올바른 방법입니까? COM 개체 메서드 호출 때문에 문제가 발생할 수 있습니까?

답변

4

COM 개체가 스레드 안전합니까? 그렇지 않은 경우 STA 스레드를 사용하여 작업을 수행하는 STA (단일 스레드 아파트) 모드로 초기화 될 수 있습니다. 따라서 새 스레드를 만들어도 STA 스레드로 다시 전환되어 UI 이벤트가 차단됩니다. COM 라이브러리의 소스를 제어 할 수있는 경우 코드가 실제로 스레드 세이프 (threadafe safe) 인 한 해당 설정을 변경할 수 있습니다.

편집 : 관련 게시물 섹션에서이 링크를 찾았다면 해당 정보가 적용될 수 있습니다. UI thread is blocking a background thread calling a COM object.

+0

내 경우처럼 보입니다. 감사합니다 –

0

이 상황에서 올바른 것은 많은 의미가 있습니다. :/

COM 개체 메서드 호출로 인해 문제가 발생할 수 있습니까?

글쎄, 당신이 전화를 제거하고 응용 프로그램이 빨리 내가 ​​말하고 싶지만 다음 실행하는 경우 :

이이 작업을 수행하는 올바른 방법인가 .. 그래?

가장 좋은 대답은 질문입니까? 작동합니까? 그렇다면 올바른 길을 가고있을 것입니다.

com 객체가 무엇인지 전혀 알지 못하기 때문에 확실하게 말하기 어렵습니다. 단일 스레드 작동을 위해 설계 되었습니까? 다중 쓰레드가 인스턴스를 생성하면 어떻게 동작할까요? 즉, com 객체 자체는 스레드로부터 안전합니까? 나는 당신이 그것에 대한 해답을 곧 찾을 수 있다고 상상해 봅니다.폭 넓은 질문에 이제

:이 손잡이가 긴 비동기 프로세스을 실행하는 올바른 방법

인가?

예.

+0

그래서 실제로 말하고있는 것은 COM 객체에 대한 메소드 호출이 호출을 수행 한 스레드에서 실행되며 호출이 수행 된 스레드를 확인하지 않아도된다는 것입니다. 나는 COM 객체에 대한 경험이 거의 없지만이 경우에는 속도를 높이는 방법이 없습니다. BTW는 작동하지만 앱 속도가 향상되지 않습니다. : D –

+0

@ MarinoŠimić : 아니, 마이클이 그렇게 말한 것 같아. ;) 그는 맞다. – NotMe

관련 문제