2012-04-19 4 views
3

)이 예제에 대한 질문 : Asynchronous Client Socket. 그것은 작업이 비동기 그들이 (제시 beginxxx/endxxx), 그러나 그들은 ManualResetEvent 사용하고 난 제대로 샘플 코드를 이해한다면 말한다 - 같은 통화 :비동기 클라이언트 소켓 예제 (

Receive(client); 
    receiveDone.WaitOne(); 

스레드를 차단합니다, 그들은 에서 전화했다. 그래서 만약 내가 UI를 가진 응용 프로그램을 가지고 있고 주 스레드에서 그 비동기 소켓 코드를 호출 - 응용 프로그램이 동결됩니다 ... 아니면 내가 틀렸어? 죄송합니다, 나는 메인 스레드를 동결하지 않고 비동기 적으로 tcp를 통해 몇 가지 명령을 보내거나받을 것으로 예상됩니다. 동결을 피하기 위해 샘플에서 모든 소켓 작업을 호출해야합니까?

+0

이 예제는 콘솔 응용 프로그램 용입니다. 내 생각에 GUI 응용 프로그램에서보기에 Receive 콜백 그리기 업데이트를 가질 수 있고 Send 함수는 버튼 클릭 (또는 다른 이벤트)에서만 호출 될 수 있기 때문에 더 유용 할 것이라고 생각합니다. 이 예제에서 차단할 유일한 이유는 연결, 보내기, 받기, 닫기의 선형 이벤트를 보장하고 콜백이 완료되기 전에 프로그램이 종료되지 않도록하는 것입니다. – styfle

답변

2

예,이 코드가 설정되어 있습니다. 그러나 Beginxxx 및 Endxxx 호출은 비동기 작업의이 (좋지 않은) 예제가 작성되어 있으므로 쉽게 래핑하는 대신 사용할 수 있습니다.

더 명확한 설명을 위해, 기사는 비동기 적으로 각각의 방법을 실행 않지만, 다음 beginconnect 콜백 콜백이있을 것이다 송신을 트리거하도록 수 있습니다 blocker.WaitOne(); 이런 일에 더 나은 방법을 사용하여 블록

등을받을 트리거하도록

TPL을 사용하고 ContinueWith 기능을 활용하여이 작업을 수행 할 수도 있습니다. 그러면 코드가 더 깨끗해질 수도 있습니다.

+0

감사합니다;) 작업을 사용합니다. 나는 MSDN이 베스트 프랙티스를 제공한다고 생각했다. ... – 0x49D1

+0

@ 0x49D1 종종 그 것이 맞다. 그러나 삶의 모든 것과 마찬가지로, 그것은 특정 장소에서 왔기 때문에 결코 무언가에 동의해서는 안된다.)). 또한 종종 MSDN 기사는 외부인이 작성하므로 (여기서는 표시되지 않음) 항상 Redmond에서 직접적인 것은 아닙니다. –

1

UI가 차단됩니다. MSDN 예제는 비동기 적이지만 매우 불충분 함을 보여줍니다. 그것도 원초적입니다. 다른 비동기 프로그래밍 모델에 대해서도 방금 답변 한 주제를 살펴보십시오. 나는 꽤 많은 것을 토론하고 그들 모두를위한 링크를 제공한다.

는 링크 :이 동 기적으로 실행되도록 Need help to implement multithreading in C#

+0

대답 해 주셔서 감사합니다. 저는 ive가 어리석은 일을하고 두려운 것을 알았습니다. 올바르게 이해했습니다. @David Anderson, 예제를 가져 주셔서 감사합니다! – 0x49D1