Mam TcpClient, którego używam do wysyłania danych do detektora na komputerze zdalnym. Komputer zdalny będzie czasem włączony, a czasami wyłączony. Z tego powodu TcpClient nie będzie się często łączyć. Chcę TcpClient do limitu czasu po jednej sekundzie, więc nie zajmuje dużo czasu, gdy nie może połączyć się z komputerem zdalnym. Obecnie używam tego kodu dla TcpClient:Jak ustawić limit czasu dla TcpClient?
try
{
TcpClient client = new TcpClient("remotehost", this.Port);
client.SendTimeout = 1000;
Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
data = new Byte[512];
Int32 bytes = stream.Read(data, 0, data.Length);
this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes);
stream.Close();
client.Close();
FireSentEvent(); //Notifies of success
}
catch (Exception ex)
{
FireFailedEvent(ex); //Notifies of failure
}
Działa to wystarczająco dobrze do obsługi zadania. Wysyła go, jeśli może, i przechwytuje wyjątek, jeśli nie może połączyć się z komputerem zdalnym. Jednak gdy nie może się połączyć, odrzucić wyjątek trwa dziesięć do piętnastu sekund. Potrzebuję czasu, by zająć około sekundy? Jak zmienić limit czasu?
jaki jest sens korzystania z asynchroniczny połączyć i „synchronizować” go z powrotem czekać? Mam na myśli, obecnie próbuję zrozumieć, jak zaimplementować timeout z asynchronicznym odczytem, ale rozwiązaniem nie jest całkowite wyłączenie projektu asynchronicznego. powinien używać limitów czasu na gniazda lub tokena anulowania lub coś w tym stylu. w przeciwnym razie użyj po prostu connect/read ... – RoeeK
@RoeeK: Chodzi o to, co mówi pytanie: programowo wybierz dowolny czas oczekiwania na próbę połączenia. To nie jest przykład na wykonanie asynchronicznej operacji wejścia/wyjścia. – Jon
@RoeeK: Cały punkt tego pytania jest taki, że 'TcpClient' nie oferuje funkcji synchronizacji połączenia z konfigurowalnym czasem oczekiwania, który jest jednym z twoich proponowanych rozwiązań. Jest to obejście umożliwiające jego włączenie. Nie jestem pewien, co jeszcze mogę powiedzieć bez powtarzania się. – Jon