C#으로 작성된 라이브러리를 사용하는 C++/CLI로 작성된 응용 프로그램이 있습니다. 이 응용 프로그램은 표준 소켓 API를 사용하여 작성되었으며 select()를 사용하여 일반적인 비 비동기 소켓을 다중화합니다. 그러나 타사 라이브러리는 .NET 소켓을 사용하고 비동기 결과 및 콜백을 사용합니다.select()를 사용하는 비동기 .NET 소켓 및 표준 소켓 : select()가 비동기 콜백을 방지하는 이유는 무엇입니까?
다음은 시나리오입니다. 메인 스레드 (주로 네이티브 스타일 코드를 사용하는 C++/CLI 응용 프로그램)에 일반 소켓을 만듭니다. 제 3 자 라이브러리 공급 업체의 C# "session"객체를 만듭니다.이 객체는 내부적으로 .NET 클래스의 비동기 소켓이 있습니다.
내가 알아챈 점은 C# "세션"개체를 인스턴스화하는 주 스레드의 select()에 NULL 시간 제한 매개 변수를 넣으면 해당 .NET 소켓에 대해 비동기 콜백이 수행되지 않는다는 것입니다. 1 초의 타임 아웃을 사용하고 비동기 소켓에서 다른 활동이 발생하지 않으면 select()가 시간 초과 될 때까지 비동기 소켓 콜백이 전달되지 않습니다.
아무튼 select()가 .NET 소켓에 콜백을하지 못하게합니다. 어떻게 이것을 피할 수 있습니까? .NET 소켓에 비동기 콜백을 전달할 수있는 이전 소켓에 사용할 수있는 대체 폴링 메서드가 있습니까?
콜백이 동일한 스레드에서 발생한다고 상상해보십시오. Select()가 해당 스레드를 차단하면 실행 루프에서 다른 것을 처리 할 수 없습니다. –
내가 혼란스러워하는 부분은 select()에 대한 MSDN 도움말이 차단 될 때 경고 대기 상태임을 나타냅니다. .NET 비동기 콜백은 "경고"를 발생시키는 것으로 간주되지 않습니까? –
나는 모든 .Net 콜백이 Application.DoEvents()에서 처리된다고 생각한다. http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx –