멀티 스레드 프로그램에 멀티 스레드 지원이없는 단일 스레드 API를 통합하려고합니다. 주 스레드에서 모든 API 상호 작용을 유지하고 다른 스레드에서 다른 작업을 수행하고 싶습니다. 그러나 내가 작업하고있는 프로그램에는 프로듀서 - 소비자 지향 스레딩 디자인이 있습니다 (수정할 수는 없습니다).스레딩 실패 문제 C#
원하는 경우 스레드를 주 스레드로 전환 할 수있는 방법이 있습니까? 아니면 다른 방법으로 작동 시키려면?
나는 명확
멀티 스레드 프로그램에 멀티 스레드 지원이없는 단일 스레드 API를 통합하려고합니다. 주 스레드에서 모든 API 상호 작용을 유지하고 다른 스레드에서 다른 작업을 수행하고 싶습니다. 그러나 내가 작업하고있는 프로그램에는 프로듀서 - 소비자 지향 스레딩 디자인이 있습니다 (수정할 수는 없습니다).스레딩 실패 문제 C#
원하는 경우 스레드를 주 스레드로 전환 할 수있는 방법이 있습니까? 아니면 다른 방법으로 작동 시키려면?
나는 명확
당신이 기본 사용자 인터페이스 스레드에 대한 몇 가지 코드를 실행하도록 작업자 스레드에 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
}
이 일반적으로 비 스레드 안전 코드를 호출 허용 방법입니다.
하나의 "메인"스레드가 (보통) 처리하는 창 메시지를 사용해 볼 수 있습니다. 창을 만들고 API 메소드를 모방 한 래퍼를 클라이언트에 표시하고 내부적으로 창 메시지를 보냅니다. 창 메시지를 처리 할 때 실제 구현을 호출하십시오.
이것은 COM 단일 스레드 아파트 모델이 작동하는 방식이며 정확히 동일한 문제를 해결합니다. 그러나 이것은 아주 진보 된 솔루션입니다.
코드를 리팩터링하여 스레드로부터 안전하게 만들 수 없습니까? 그것은 더 간단 할 것이라고 나는 생각한다.
어떤 응용 프로그램입니까? WinForms, WPF, ASP.NET, Silverlight, Windows Phone 7, Zune, XBox 360, Windows 8 Metro, ...? –
IT는 프로그램 API와 다른 프로그램 간의 상당히 낮은 수준의 어댑터입니다. 맨위로 WPF – Brent