이번에는 초기 버전의 MSDN 예제를 기반으로하는 Async Socket Client와 관련된 또 다른 네트워킹 관련 질문입니다. 종점에 스위칭 네트워크 코드에있는 경우C# Async 소켓 클라이언트 블록 기본 인터페이스 스레드
//Mouse Event handler for main thread
private void btn_Read_MouseDown(object sender, MouseEventArgs e)
{
Stopwatch sw = Stopwatch.StartNew();
if (!networkDev.Connected)
networkDev.Connect("192.168.1.176", 1025);
if(networkDev.Connected)
networkDev.getReading();
sw.Stop();//Time time taken...
}
- 사용자가 비동기 연결 시도가 네트워크 장치에 연결되어, 인터페이스의 버튼을 클릭하면 현재하면, 코드는 다음과 같습니다 잘 작동합니다 (전체 작동에 대해 1 초 미만). 그러나 네트워크 장치를 끄거나 사용할 수없는 경우 AsyncSocket Connect 함수는 기본 폼 스레드를 유지합니다. 현재 장치를 사용할 수없는 경우 전체 인터페이스가 약 20 초 동안 잠 깁니다 (스톱워치 사용). 주 스레드가 연결 요청에 대한 응답을 기다리고 있기 때문에 잠겨 있다고 생각합니다. 연결 요청을 다른 스레드에 넣어야한다는 의미입니까?
내가 코드를 내가 사용하고있는 비동기 소켓 클라이언트를 포함 한 -
public bool Connect(String ip_address, UInt16 port)
{
bool success = false;
try
{
IPAddress ip;
success = IPAddress.TryParse(ip_address, out ip);
if (success)
success = Connect(ip, port);
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
return success;
}
public bool Connect(IPAddress ip_address, UInt16 port)
{
mSocket.BeginConnect(ip_address, port,
new AsyncCallback(ConnectCallback), mSocket);
connectDone.WaitOne();//Blocks until the connect operation completes,
//(time taken?) timeout?
return mSocket.Connected;
}
private void ConnectCallback(IAsyncResult ar)
{
//Retreive the socket from thestate object
try
{
Socket mSocket = (Socket)ar.AsyncState;
//Set signal for Connect done so that thread will come out of
//WaitOne state and continue
connectDone.Set();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
}
나는 그것의 자신의 스레드가 비동기 클라이언트를 사용하여이 다음 인터페이스 호스트 didn를이 경우 동결을 중지 할 것을 바라고 있었다
존재하지 않지만 이것이 사실 인 것처럼 보입니다. 초기 연결 실패 후 20 초가 지나면 모든 후속 연결 시도가 즉시 반환됩니다 (ms 미만). 또한 이상한 생각이 들었습니다. 초기 연결 시도가 성공하면 나중에 존재하지 않는 호스트에 연결하는 모든 호출이 즉시 반환됩니다. 무슨 일이 일어나고 있는지에 대해 다소 당혹 스럽지만, Socket이 사용하는 사실과 관련된 것이 AsyncSocket 클래스에 저장되어 있는지 궁금합니다. 클라이언트 코드가 더 필요하다면 어떤 도움을 주시면 감사하겠습니다.
곳은 말한다 WaitOne 옆에있는 코멘트에서 "블록 작업이 완료 될 때까지?" 얼마나 비동기 적이며 어떤 스레드가 블록하다고 생각하십니까? – R0MANARMY
나는 이제 이것을 꺼내 보았는데, 이것은 얼핏보기에 얼어 붙은 인터페이스에 관한 문제가 명백하게 드러났습니다. 이것은 초기 질문이었던 인터페이스 문제를 해결합니다. 그러나 Connect가 완료 할 수없는 경우 다시 사용할 수 없으며 비교적 자주 연결이 끊어 질 때 문제가 발생합니다. 각 AsyncClient는 1 소켓에 묶여 있습니다. 재 연결을 허용하는 가장 좋은 방법은 무엇입니까? 현재 스레드가 이전 연결 시작을 기다리고 있다는 예외가 발생합니다. 더 나은 해결책에 대한 제안은 감사하겠습니다. – jackocurly0074