Timeout по Socket.BeginReceive
От: Marek  
Дата: 21.02.11 07:04
Оценка:
Подскажите, пожалуйста, как можно организовать проверку на timeout по приему данных, если использовать Socket.BeginReceive?
После BeginReceive запускаю таймер, который, если не был выполнен асинхронный делегат приема данных, срабатывает, но вот как по событию таймера отменить BeginReceive не знаю. Буду благодарен за советы.
Re: Timeout по Socket.BeginReceive
От: MozgC США http://nightcoder.livejournal.com
Дата: 21.02.11 07:16
Оценка: +1
Здравствуйте, Marek, Вы писали:

M>Подскажите, пожалуйста, как можно организовать проверку на timeout по приему данных, если использовать Socket.BeginReceive?

M>После BeginReceive запускаю таймер, который, если не был выполнен асинхронный делегат приема данных, срабатывает, но вот как по событию таймера отменить BeginReceive не знаю. Буду благодарен за советы.

Наверное придется просто закрывать сокет. При этом выполнится callback-метод, и если там вы вызываете EndReceive(), то наверное будет исключение ObjectDisposedException (влом проверять), так что предусмотрите это.
Re[2]: Timeout по Socket.BeginReceive
От: Marek  
Дата: 21.02.11 07:46
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Здравствуйте, Marek, Вы писали:


M>>Подскажите, пожалуйста, как можно организовать проверку на timeout по приему данных, если использовать Socket.BeginReceive?

M>>После BeginReceive запускаю таймер, который, если не был выполнен асинхронный делегат приема данных, срабатывает, но вот как по событию таймера отменить BeginReceive не знаю. Буду благодарен за советы.

MC>Наверное придется просто закрывать сокет. При этом выполнится callback-метод, и если там вы вызываете EndReceive(), то наверное будет исключение ObjectDisposedException (влом проверять), так что предусмотрите это.


А как в общем случаи грамотные люди делают проверку на timeout?)
Re[3]: Timeout по Socket.BeginReceive
От: _FRED_ Черногория
Дата: 21.02.11 07:56
Оценка: 3 (1)
Здравствуйте, Marek, Вы писали:

M>А как в общем случаи грамотные люди делают проверку на timeout?)


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

Если отмена не поддерживается, клиенту остаётся не много: или просто перестать ждать или взвести флаг о том, что результат операции более не актуален и осоществлять какие-то действия уже в End-методе.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Timeout по Socket.BeginReceive
От: _FRED_ Черногория
Дата: 21.02.11 07:59
Оценка:
Здравствуйте, MozgC, Вы писали:

M>>Подскажите, пожалуйста, как можно организовать проверку на timeout по приему данных, если использовать Socket.BeginReceive?

M>>После BeginReceive запускаю таймер, который, если не был выполнен асинхронный делегат приема данных, срабатывает, но вот как по событию таймера отменить BeginReceive не знаю. Буду благодарен за советы.

MC>Наверное придется просто закрывать сокет.


А что при этом произойдёт на сервере? Перестанет ли он обрабатывать запрос?
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Timeout по Socket.BeginReceive
От: HowardLovekraft  
Дата: 21.02.11 08:11
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А что при этом произойдёт на сервере? Перестанет ли он обрабатывать запрос?

Если речь о чтении/записи в сокет на другой стороне соединения, то свалится с ошибкой, скорее всего, WSAECONNRESET (10054).
Re[4]: Timeout по Socket.BeginReceive
От: Marek  
Дата: 21.02.11 08:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Marek, Вы писали:


M>>А как в общем случаи грамотные люди делают проверку на timeout?)


_FR>Вопрос в том, поддерживает ли ваша асинхронная операция отмену. Если не поддерживает, то отменить её в общем случае нельзя. Так же некоторые асинхронные операции сами имеют таймаут, и пользователю достаточно его выставить.


_FR>Если отмена не поддерживается, клиенту остаётся не много: или просто перестать ждать или взвести флаг о том, что результат операции более не актуален и осоществлять какие-то действия уже в End-методе.


Спасибо за идею — думаю при срабатывании таймера выставлять флаг неактуальности и заново запускать запрос на данные.
Re[5]: Timeout по Socket.BeginReceive
От: HowardLovekraft  
Дата: 21.02.11 08:20
Оценка:
Здравствуйте, Marek, Вы писали:

M>Спасибо за идею — думаю при срабатывании таймера выставлять флаг неактуальности и заново запускать запрос на данные.

Socket.BeginReceive Method:

To cancel a pending BeginReceive, call the Close method.

Re[6]: Timeout по Socket.BeginReceive
От: Marek  
Дата: 21.02.11 08:31
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Marek, Вы писали:


M>>Спасибо за идею — думаю при срабатывании таймера выставлять флаг неактуальности и заново запускать запрос на данные.

HL>Socket.BeginReceive Method:
HL>

HL>To cancel a pending BeginReceive, call the Close method.

HL>

Я читал это, но получается, что вызывая Close мы закрываем соединение, что мне не подходит.
Re[4]: Timeout по Socket.BeginReceive
От: _FRED_ Черногория
Дата: 21.02.11 08:37
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

_FR>>А что при этом произойдёт на сервере? Перестанет ли он обрабатывать запрос?

HL>Если речь о чтении/записи в сокет на другой стороне соединения, то свалится с ошибкой, скорее всего, WSAECONNRESET (10054).

С обращением к самому сокету всё понятно. Вопрос в выполняющейся логике: она при закрытии сокета так и будет выполняться (например, форматировать диск), пока не попробует что-то со своей стороны отправить.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.