2012-03-14 2 views
0

Windows CE에서 소켓의 비동기 패턴, 특히 소켓의 BeginRead에 스레드를 사용하는 방법에 대한 확인 또는 문서를 찾는 것입니다. MSDN의 설명서를 살펴 보았지만 모호한 참조 만 찾을 수 있습니다. 여기에 대해 살펴 보았고 데스크톱 스레딩 모델에 대한 답변을 찾았습니다. 부수적으로이 프로그램은 Compact Framework에서 구현됩니다.BeginRead/EndRead에 대한 Windows CE 6.0 스레딩 모델은 무엇입니까?

필자의 이해 내용은 다음과 같습니다. BeginXXX를 데스크톱에서 호출 할 때 콜백은 BeginXXX를 호출하는 스레드와 다른 스레드에 의해 호출되거나 호출되지 않을 수 있습니다. (내가 읽었으며 실험 한 ThreadPool에서 가져옴)

Windows CE에서 BeginXXX를 호출하면 BeginXXX를 호출 한 스레드가 콜백을 처리합니다.

정확합니까? 그렇다면 어디에서 설명서를 찾을 수 있습니까? STW는 도움이되지 않았고 RTM도 도움이되지 않았습니다.

+1

이것은 충분한 이유가 문서화되어 있지 않기 때문에 I/O 완료 스레드에서 콜백을 수행 할 수 있다고 가정해야합니다. 단축키는 허용되지 않습니다. 무시하면 문제가 발생할 수 있습니다. 충분한 데이터가 버퍼링 될 때 발생하는 동일한 스레드에서 콜백을 확실히 얻을 수 있습니다. 아마 느린 CPU를 가진 장치에서 일어날 가능성이 있습니다. –

+0

@HansPassant '는 I/O 완료 스레드에서 콜백을 수행 할 수 있다고 가정합니다. IO가 동기식으로 진행되거나 '경고 가능한'호출을해야하는 경우가 아니라면 발신 스레드가 콜백을 실행하도록 신호를받을 수있는 방법을 알 수 없습니다. 원래 스레드는 콜백 시간에 사용 중이거나 어쩌면 존재하지 않을 수도 있습니다. –

+0

문서화하지 않는 것이 좋은 이유가있을 것이라고 상상할 수 없습니다. 내 응용 프로그램은 BeginReceive가있는 소켓에서 메시지를받습니다. Send()를 사용하여 명령을 보냅니다. 보낸 명령으로 인해 '확인'이 비동기로 수신됩니다. 괜찮 으면 나도 기다려야 해. ManualResetEvent를 사용하여 WaitOne() 명령을 실행 한 다음 OK를 누릅니다. 이것은 항상 타임 아웃되고 타임 아웃 중에는 소켓에서 아무것도 얻지 못합니다. 재설정 이벤트가 실패하면 OK가 표시됩니다. 내가 설명 할 수있는 유일한 방법은 호출 스레드가 BeginReceive에서 콜백을 처리 할 것으로 예상되는 스레드인지 여부입니다. –

답변

0

수동으로 스레딩해야했습니다. 스레딩 모델은 Windows CE 6에서 데스크톱 플랫폼과 약간 다릅니다. 비동기 코드는 데스크톱에서 개발했지만 CE에서는 전혀 작동하지 않을 때 잘 동작했습니다. 나는 보내고 소켓에 앉아 스레드를받을 shimming 결국. 나는 아직도 이유가 확실하지 않다. 하드웨어 드라이버에 대한 플랫폼 코드를 작성한 공급 업체가 소형 프레임 워크가 기대하는 것과 동등하지 않은 결정을 내린 것으로 생각한다. 어쨌든 이제는 작동하고 블로킹하는 스레드는 내 스레드이며 메인 스레드를 중지하지 않고도 차단할 수 있습니다.