Вопрос

Я использую NetworkStream & TCPClient, чтобы асинхронно получать данные, используя BeginLead. Мне нужно применить тайм-аут этой операции, так что после указанного количества времени чтение будет прервано.

Насколько я могу сказать, это не поддерживается на NetworkStream или TCPClient - есть ключевое свойство, но это, по-видимому, применимо только к синхронному эквиваленту - «чтение».

Даже базовый класс сокета не оказывает поддержку тайм-аутам в его начальном методе.

Я искал по этому вопросу, и единственное предложенное решение, которое я видел, - это создать еще одну фоновую нить для отмены операции, если она не завершена в течение периода времени ожидания. Это похоже на ужасный взлом. Конечно, есть лучший способ?

Это было полезно?

Решение

Это единственный способ сделать это, потому что, когда вы используете асинхронную операцию, нить, которая инициировала операцию, выключается, что делает что-то еще. Тайм-аут доступен с синхронной версией, поскольку резьба выполнения заблокирована до завершения операции чтения.

Если вам придется использовать фоновую нить, чтобы отменить операцию, однако, не будет много смысла, чтобы продолжать использовать асинхронные методы начала / конца. Если вы собираетесь вращать фоновую нить, просто выполните синхронную операцию чтения с фоновой резьбы, а затем вы можете использовать получение.

Другие советы

Ждать ManualResetEvent с некотором значений тайм-аута для сигнала, когда ваша задача закончена. Если это раз раз превышает сигнал, то вы знаете, что асинхронная операция никогда не завершена.

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);

Внутри начинающего обратного вызова, используйте

private void ReceiveCallBack(IAsyncResult ar)
{
    /** Use ar to check if receive is correct and complete */
    receiveDone.Set();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top