Из stream должны поступить байты, но могут и не поступить. Если байты не поступают, то на (3) программа зависает на очень долго.
Я понимаю что EndRead ждет завершения асинхронной операции. Но после 1000 мс данные мне уже не актуальны.
MSDN говорить что нужно после BeginRead обязательно использовать EndRead. Как сделать чтобы (3) не зависало?
Здравствуйте, SATANAblack, Вы писали:
SAT>Я понимаю что EndRead ждет завершения асинхронной операции. Но после 1000 мс данные мне уже не актуальны. SAT>MSDN говорить что нужно после BeginRead обязательно использовать EndRead. Как сделать чтобы (3) не зависало?
В BeginRead указать AsyncCallback, в котором вызывать EndRead, и если данные не нужны — то выбрасывать их.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SATANAblack, Вы писали:
SAT>>Ну а если сделать так?
A>Ресурсы будут течь. Лучше всего дождаться данных, а уже потом проверять сколько времени прошло.
Программа используется для чтения/записи контроллера, через интерфейс COM/TCP. Если данных нет 1-2 сек, то нужно снова слать новый запрос.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SATANAblack, Вы писали:
SAT>>Если данных нет 1-2 сек, то нужно снова слать новый запрос.
A>А в старом запросе приходит ноль байт?
Сначала я: BeginWrite...EndWrite — все хорошо, я отправил запрос
Потом: BeginRead ....EndRead — контроллер просто не ответил, вообще ничего.
Здравствуйте, SATANAblack, Вы писали:
SAT>Сначала я: BeginWrite...EndWrite — все хорошо, я отправил запрос SAT>Потом: BeginRead ....EndRead — контроллер просто не ответил, вообще ничего.
Когда вы дожидаетесь завершения EndRead данные от контроллёра приходят или нет?
Вы сейчас описываете следующую ситуацию (в хронологическом порядке)
A>Когда вы дожидаетесь завершения EndRead данные от контроллёра приходят или нет? A>Вы сейчас описываете следующую ситуацию (в хронологическом порядке) A>BeginRead1 A>прошла секунда секунду A>BeginRead2 A>EndRead2 (получили данные) A>EndRead1 (пустой ответ)
Нет, я такого не описываю.
У меня должен быть на каждый запрос — ответ.
Если ответа нет повторить запрос.
Если ответа нет повторить запрос еще.
Если снова ответа нет — заканчиваем всё.
Здравствуйте, SATANAblack, Вы писали:
SAT>Нет, я такого не описываю. SAT>У меня должен быть на каждый запрос — ответ. SAT>Если ответа нет повторить запрос. SAT>Если ответа нет повторить запрос еще. SAT>Если снова ответа нет — заканчиваем всё.
Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SATANAblack, Вы писали:
SAT>>Короче, запрашиваем пока не ответят. Но если не ответили BeginRead() остается ждать ответа.
A>Ну и ждите, в чём проблема вообще не ясно.
Проблема в том что не надо мне ждать больше 1 сек.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SATANAblack, Вы писали:
SAT>>Нет, я такого не описываю. SAT>>У меня должен быть на каждый запрос — ответ. SAT>>Если ответа нет повторить запрос. SAT>>Если ответа нет повторить запрос еще. SAT>>Если снова ответа нет — заканчиваем всё.
A>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.
Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?
Ну припустим вывести сообщение про то сколько принято байт.0,10,500...
Здравствуйте, SATANAblack, Вы писали:
A>>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.
SAT>Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?
анализировать время между Begin и End в AsyncCallback.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SATANAblack, Вы писали:
A>>>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.
SAT>>Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?
A>анализировать время между Begin и End в AsyncCallback.
Проанализировал, решил что даных уже не будет. Как продолжить работу?
Здравствуйте, SATANAblack, Вы писали:
SAT>Проанализировал, решил что даных уже не будет. Как продолжить работу?
Решать продолжать ли работу вам надо в другом потоке. В AsyncCallback вы анализируете время, вызываете EndRead, изменяете внутренее состояние. Вам надо после BeginRead зафиксировать момент времени и начать раз в 100мс, например, проверять пришёл ли ответ (это вы из AsyncCallback будете указывать), и если не пришёл то повторять запрос снова.