Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 12:11
Оценка:
Есть такой код:
stream.ReadTimeout = 1000;
IAsyncResult result = stream.BeginRead(BufferIn, 0, 1, null, stream); (1)
result.AsyncWaitHandle.WaitOne(1000); (2)
stream.EndRead(result); (3)


Из stream должны поступить байты, но могут и не поступить. Если байты не поступают, то на (3) программа зависает на очень долго.
Я понимаю что EndRead ждет завершения асинхронной операции. Но после 1000 мс данные мне уже не актуальны.
MSDN говорить что нужно после BeginRead обязательно использовать EndRead. Как сделать чтобы (3) не зависало?
Re: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 12:27
Оценка:
Здравствуйте, SATANAblack, Вы писали:

AFAIK такое не уровне WinAPI не возможно, так что...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Stream.Beginread() ...EndRead()
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.09.11 12:32
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Я понимаю что EndRead ждет завершения асинхронной операции. Но после 1000 мс данные мне уже не актуальны.

SAT>MSDN говорить что нужно после BeginRead обязательно использовать EndRead. Как сделать чтобы (3) не зависало?
В BeginRead указать AsyncCallback, в котором вызывать EndRead, и если данные не нужны — то выбрасывать их.
Re[2]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 12:36
Оценка:
Здравствуйте, adontz, Вы писали:

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


A>AFAIK такое не уровне WinAPI не возможно, так что...


Ну а если сделать так?

stream.ReadTimeout = 1000;
result = stream.BeginRead(BufferIn, 0, 1, null, stream);
if(result.AsyncWaitHandle.WaitOne(1000))
   stream.EndRead(result);

В данный момент я проблему решу, но что будет если я захочу снова что нибуть записать в поток?
Re[3]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 12:37
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Ну а если сделать так?


Ресурсы будут течь. Лучше всего дождаться данных, а уже потом проверять сколько времени прошло.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 12:40
Оценка:
Здравствуйте, adontz, Вы писали:

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


SAT>>Ну а если сделать так?


A>Ресурсы будут течь. Лучше всего дождаться данных, а уже потом проверять сколько времени прошло.


Программа используется для чтения/записи контроллера, через интерфейс COM/TCP. Если данных нет 1-2 сек, то нужно снова слать новый запрос.
Re[5]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 12:42
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Если данных нет 1-2 сек, то нужно снова слать новый запрос.


А в старом запросе приходит ноль байт?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 12:47
Оценка:
Здравствуйте, adontz, Вы писали:

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


SAT>>Если данных нет 1-2 сек, то нужно снова слать новый запрос.


A>А в старом запросе приходит ноль байт?


Сначала я: BeginWrite...EndWrite — все хорошо, я отправил запрос
Потом: BeginRead ....EndRead — контроллер просто не ответил, вообще ничего.
Re[7]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 12:49
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Сначала я: BeginWrite...EndWrite — все хорошо, я отправил запрос

SAT>Потом: BeginRead ....EndRead — контроллер просто не ответил, вообще ничего.

Когда вы дожидаетесь завершения EndRead данные от контроллёра приходят или нет?

Вы сейчас описываете следующую ситуацию (в хронологическом порядке)

BeginRead1
прошла секунда секунду
BeginRead2
EndRead2 (получили данные)
EndRead1 (пустой ответ)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 12:53
Оценка:
Полный алгоритм общения должен быть такой:

1)BeginWrite(Запрос1)
2)Ответ1=BeginRead()
3)if(Ответ1==0) goto 1)

4)BeginWrite(Запрос2)
5)Ответ2=BeginRead()
6)if(Ответ2==0) goto 4)

Короче, запрашиваем пока не ответят. Но если не ответили BeginRead() остается ждать ответа.
Re[8]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 12:55
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Короче, запрашиваем пока не ответят. Но если не ответили BeginRead() остается ждать ответа.


Ну и ждите, в чём проблема вообще не ясно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 13:03
Оценка:
A>Когда вы дожидаетесь завершения EndRead данные от контроллёра приходят или нет?
A>Вы сейчас описываете следующую ситуацию (в хронологическом порядке)
A>BeginRead1
A>прошла секунда секунду
A>BeginRead2
A>EndRead2 (получили данные)
A>EndRead1 (пустой ответ)

Нет, я такого не описываю.
У меня должен быть на каждый запрос — ответ.
Если ответа нет повторить запрос.
Если ответа нет повторить запрос еще.
Если снова ответа нет — заканчиваем всё.
Re[9]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 13:04
Оценка:
Здравствуйте, SATANAblack, Вы писали:

SAT>Нет, я такого не описываю.

SAT>У меня должен быть на каждый запрос — ответ.
SAT>Если ответа нет повторить запрос.
SAT>Если ответа нет повторить запрос еще.
SAT>Если снова ответа нет — заканчиваем всё.

Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[9]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 13:07
Оценка:
Здравствуйте, adontz, Вы писали:

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


SAT>>Короче, запрашиваем пока не ответят. Но если не ответили BeginRead() остается ждать ответа.


A>Ну и ждите, в чём проблема вообще не ясно.


Проблема в том что не надо мне ждать больше 1 сек.
Re[10]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 13:08
Оценка:
Здравствуйте, SATANAblack, Вы писали:

A>>Ну и ждите, в чём проблема вообще не ясно.

SAT>Проблема в том что не надо мне ждать больше 1 сек.

Ждите сколько получится и уже когда дождались проверяйте сколько ждали.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 13:10
Оценка:
Здравствуйте, adontz, Вы писали:

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


SAT>>Нет, я такого не описываю.

SAT>>У меня должен быть на каждый запрос — ответ.
SAT>>Если ответа нет повторить запрос.
SAT>>Если ответа нет повторить запрос еще.
SAT>>Если снова ответа нет — заканчиваем всё.

A>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.


Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?
Ну припустим вывести сообщение про то сколько принято байт.0,10,500...
Re[11]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 13:11
Оценка:
Здравствуйте, SATANAblack, Вы писали:

A>>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.


SAT>Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?


анализировать время между Begin и End в AsyncCallback.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[12]: Stream.Beginread() ...EndRead()
От: SATANAblack  
Дата: 28.09.11 13:16
Оценка:
Здравствуйте, adontz, Вы писали:

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


A>>>Лучшее что вы можете сделать, анализировать время между Begin и End в AsyncCallback.


SAT>>Ну...и...вот ето я и спрашиваю. Анализирую...прошла 1 секунда....что делать дальше? Как разумно продолжить выполнение программы?


A>анализировать время между Begin и End в AsyncCallback.


Проанализировал, решил что даных уже не будет. Как продолжить работу?
Re[13]: Stream.Beginread() ...EndRead()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.09.11 13:19
Оценка: 3 (1)
Здравствуйте, SATANAblack, Вы писали:

SAT>Проанализировал, решил что даных уже не будет. Как продолжить работу?


Решать продолжать ли работу вам надо в другом потоке. В AsyncCallback вы анализируете время, вызываете EndRead, изменяете внутренее состояние. Вам надо после BeginRead зафиксировать момент времени и начать раз в 100мс, например, проверять пришёл ли ответ (это вы из AsyncCallback будете указывать), и если не пришёл то повторять запрос снова.
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.