2012-07-16 1 views
0

내 winforms 클라이언트 응용 프로그램에서 WCF 서비스 (Begin ... 및 End ...)에 대한 비동기 메서드를 생성했습니다.WCF 클라이언트 : EndGetX가 호출 될 때까지 BeginGetX에 대한 호출을 제한하십시오.

응용 프로그램이 시작되면 응용 프로그램에서 나중에 사용되는 데이터 (예 : 국가 목록)를 가져오고 캐시하기 위해 서버에 대한 비동기 호출을 만듭니다.

비동기 호출이 완료되기 전에 응용 프로그램의 주 스레드에서이 데이터 (예 : 콤보 상자 채우기)를 필요로하는 경우 비동기 호출이 종료 될 때까지 주 스레드를 차단하고 싶습니다. WCF 서버에 대한 중복 호출을 피하고 싶습니다.

나는 모니터/뮤텍스를 사용하려고하고 Monitor.Enter(countryLock) 메인 스레드에서 BeginGetCountriesEndGetCountries 메서드를 호출 할 Monitor.Exit(countryLock)라고했다. 그러나 다음과 같은 예외가 있습니다.

비동기 코드 블록에서 개체 동기화 메서드가 호출되었습니다.

Monitor.Enter(...)이라는 동일한 스레드에서 Monitor.Exit(...)을 호출해야합니까? 그렇다면 어떻게 Monitor 개체의 소유자를 알 수 있으며 컨텍스트에서 전화를 걸 수 있습니까?

+0

일부 컨텍스트에서 동기화 끝점이 필요한 경우 왜 구현하지 않습니까? 당신은 당신의 서비스를 통제하고 있습니까? –

+0

여러 클라이언트가 동시에 같은 메서드를 호출하는 것에 신경 쓰지 않습니다. 단일 클라이언트가 동일한 데이터를 두 번 묻지 않도록 제한하고 싶습니다. 클라이언트는 데이터 비동기 적재를 미리 시도합니다. 그러나 클라이언트가 즉시 데이터를 필요로하고 캐시 된 데이터를 찾지 못하면 데이터가 진행 중임을 알지 못합니다. – Omtara

답변

0

아니요, 정말로 주 스레드를 차단하고 싶지는 않습니다. 당신이하고 싶은 것은 작업이 보류 중임을 나타내는 플래그를 설정하고 그 결과에 의존하는 UI 부분을 비활성화하는 것입니다. 결과가 비동기 WCF 작업에서 반환되면 UI의 해당 부분을 활성화하고 데이터를 채울 수 있습니다.

메인 스레드를 차단하면 응용 프로그램이 중단되어 사용자에게 좋지 않은 모습을 보일 것입니다.

0

피터 리치 (Peter Richie)와 마찬가지로 UI 스레드를 잠글 필요가 없습니다. "바쁜"플래그만으로도 충분합니다.

둘째, 같은 스레드가 차단하지 않고 동일한 모니터에 두 번 입력 할 수 있으므로 설명하는 것처럼 Monitor.Enter를 사용하여이 작업을 수행하려고해도 작동하지 않습니다.

잠금을 누른 경우 예, Monitor.Enter (...)를 호출 한 동일한 스레드에서 Monitor.Exit (...)을 호출해야합니다. 그것이 유일한 유일한 문제인 경우 this.BeginInvoke()로 UI 스레드로 마샬링 할 수 있습니다. 하지만 제가 말했듯이, 단일 스레드 시나리오에서 Monitor로 잠그는 것은 말이되지 않습니다.

관련 문제