Frage

Ich bin mit einem Network & TcpClient asynchron Daten empfangen Beginread verwenden. Ich brauche eine Auszeit, um diesen Vorgang anzuwenden, so dass nach einer bestimmten Zeit wird die Lese abgebrochen werden.

Was ich in der Lage bin zu sagen, dies ist nicht auf Network oder TcpClient unterstützt - gibt es eine ReceiveTimeout Eigenschaft, aber dies scheint nur auf den synchron äquivalent gelten - ‚Read‘

.

Auch die zugrunde liegende Socket-Klasse erscheint nicht auf Unterstützung Timeouts in seiner BeginReceive Methode.

Ich habe zu diesem Thema gesucht und die einzige vorgeschlagene Lösung die ich gesehen habe ist, einen anderen Hintergrund-Thread einzurichten um den Vorgang abzubrechen, wenn es nicht innerhalb der Timeout-Zeit nicht abzuschließen. Dies scheint wie eine schreckliche Hack. Sicherlich gibt es einen besseren Weg?

War es hilfreich?

Lösung

Es ist der einzige Weg, es zu tun, denn wenn man einen asynchronen Vorgang verwenden, den Thread, der die Operation eingeleitet ausgeschaltet ist noch etwas anderes zu tun. Der Timeout ist mit der synchronen Version, da die Ausführung Thread, bis der Lesevorgang abgeschlossen ist blockiert wird.

Wenn Sie einen Hintergrund-Thread verwenden müsste, um den Vorgang abzubrechen, aber wäre es nicht viel Sinn sein, um weiterhin die asynchrone Start / End-Methoden zu verwenden. Wenn Sie aus einem Hintergrund-Thread zu Spin gehen, führen Sie einfach eine synchrone Leseoperation aus dem Hintergrund-Thread, und dann können Sie die ReceiveTimeout verwenden.

Andere Tipps

Warten Sie auf Manual mit einem gewissen Timeout-Wert zu Signal, wenn Ihre Aufgabe ist beendet. Wenn es mal aus, bevor es signalisiert wird, dann wissen Sie, dass asynchrone Operation nie vollendet.

private ManualResetEvent receiveDone = new ManualResetEvent(false);

receiveDone.Reset();
socket.BeginReceive(...);
if(!receiveDone.WaitOne(new TimeSpan(0, 0, 0, 30))) //wait for 30 sec.
    throw new SocketException((int)SocketError.TimedOut);

Innerhalb BeginReceive Rückruf, Verwendung

private void ReceiveCallBack(IAsyncResult ar)
{
    /** Use ar to check if receive is correct and complete */
    receiveDone.Set();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top