2011-09-19 6 views
0

멀티 스레드 프로그램에 멀티 스레드 지원이없는 단일 스레드 API를 통합하려고합니다. 주 스레드에서 모든 API 상호 작용을 유지하고 다른 스레드에서 다른 작업을 수행하고 싶습니다. 그러나 내가 작업하고있는 프로그램에는 프로듀서 - 소비자 지향 스레딩 디자인이 있습니다 (수정할 수는 없습니다).스레딩 실패 문제 C#

원하는 경우 스레드를 주 스레드로 전환 할 수있는 방법이 있습니까? 아니면 다른 방법으로 작동 시키려면?

나는 명확

+4

어떤 응용 프로그램입니까? WinForms, WPF, ASP.NET, Silverlight, Windows Phone 7, Zune, XBox 360, Windows 8 Metro, ...? –

+0

IT는 프로그램 API와 다른 프로그램 간의 상당히 낮은 수준의 어댑터입니다. 맨위로 WPF – Brent

답변

1

당신이 기본 사용자 인터페이스 스레드에 대한 몇 가지 코드를 실행하도록 작업자 스레드에 Control.Invoke를 사용하여 문제를 표현 할 수없는 죄송합니다.

또는 lock을 사용하여 단일 스레드 API에 대한 모든 액세스를 동기화 할 수 있습니까?

자세한 내용은 훌륭하지만 훌륭한 아이디어가 있습니다.

편집 : 의견, 이전에 언급 한 바와 같이, 잠금 장치를 사용하여 동기화하는 것입니다 할 수있는 가장 쉬운 & 가장 가벼운 방법을 읽은 후. 그렇게하면 한 번에 하나의 스레드 만 제 3 자 API를 호출합니다. 예 :

static object APILock = new object(); // global variable 

// Do this anytime you need to make calls on this non-thread-safe API: 
lock (APILock) { 
    // call the API; only one thread will run code inside the lock at a time 
} 

이 일반적으로 비 스레드 안전 코드를 호출 허용 방법입니다.

+0

그래서 자물쇠 물건이 작동하지 않았지만 Control.Invoke는 내 실제 코드 프로젝트 Control.Invoke에서 위대한 – Brent

+0

작동하지 않았다,이 [질문] (http://stackoverflow.com/questions)를 참조하십시오/7517608/control-invoke-does-exist-in-current-context) – Brent

0

하나의 "메인"스레드가 (보통) 처리하는 창 메시지를 사용해 볼 수 있습니다. 창을 만들고 API 메소드를 모방 한 래퍼를 클라이언트에 표시하고 내부적으로 창 메시지를 보냅니다. 창 메시지를 처리 ​​할 때 실제 구현을 호출하십시오.

이것은 COM 단일 스레드 아파트 모델이 작동하는 방식이며 정확히 동일한 문제를 해결합니다. 그러나 이것은 아주 진보 된 솔루션입니다.

코드를 리팩터링하여 스레드로부터 안전하게 만들 수 없습니까? 그것은 더 간단 할 것이라고 나는 생각한다.