느린 메소드를 별도의 스레드에서 실행하고 싶습니다. 이 메서드는 응용 프로그램의 주 스레드에서 만든 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 개체 메서드 호출 때문에 문제가 발생할 수 있습니까?
내 경우처럼 보입니다. 감사합니다 –