2011-10-24 2 views
0

불편하게 느린 COM 구성 요소를 사용하고 있습니다. (요청 된 데이터를 제공하는 데 몇 분이 소요됩니다) UI를 응답 성있게 유지하려면 WPF 응용 프로그램에서 Task 또는 BackgroundWorker 클래스를 사용하려고합니다. 구성 요소가 스레드 가능하지 않으므로 백그라운드 스레드를 만들고 UI의 모든 컨트롤을 비활성화하여 문제를 방지하십시오.배경 작업자가 COM 구성 요소를 시작합니다.

구성 요소는 단순히 표준 COM 참조로 프로젝트에 추가됩니다. 문제는 모든 백그라운드 스레드에서 작동하지 않는다는 것입니다 (new를 사용한 초기화 포함). 그것은 UI 스레드에서 잘 작동합니다. 모든 포인터를 부탁드립니다.

+0

예, 거의 작동하지 않습니다. "단순히 작동하지 않습니다"라는 다른 종류가 있습니다.보다 구체적으로 설명해야합니다. –

+0

UI 스레드를 제외하고는 COM 구성 요소가 작동하지 않을 수도 있습니다. –

답변

3

[STAThread] 속성을 Main()에 추가하려고 했습니까? STAThreadAttribute 적용한

[STAThread] 
static void Main() 
{ 
} 

, 그것은 단일 스레드로 스레드의 현재 아파트 상태를 변경한다.
COM 및 스레딩에 대한 거대한 논의없이이 특성은 현재 스레드와 COM을 통해 대화 할 다른 스레드 간의 통신 메커니즘을 보장합니다.
새 UI 프로젝트를 시작할 때이 속성은 대개 자동으로 Main에 적용됩니다.


아니면 시도 할 수 있습니다 (SLaks는 얘기로) :

Thread t = new Thread(ThreadProc); 
t.SetApartmentState(ApartmentState.STA); 
.... 

public void ThreadProc() 
{ 
    // Thread function 
} 

당신은 또한 당신의 시도가 성공적인 것을 확인하기 위해

bool result = t.TrySetApartmentState(ApartmentState.STA); 

를 사용하고 result 값을 확인 할 수 있습니다

+1

이것은 오직'Main()'에만 해당됩니다. '새 스레드'를 시작하고'SetApartmentState'를 호출해야합니다. – SLaks

+0

Thanks @SLaks : 제안 사항을 반영하기 위해 내 게시물을 편집했습니다. 지금은 더 나아 졌다고 생각하니? ;) – Marco

+0

'Main'에 추가하면 메인 쓰레드에만 영향을줍니다. ('Main()'은 아마 이미 가지고있을 것입니다.) – SLaks

관련 문제