Хитрый WaitHandle
От: Аноним  
Дата: 08.10.10 06:32
Оценка:
Добрый день!
Есть следующая ситуация.
На сервер отправляется несколько файлов. После сохранения файлов, надо проверить их наличие на сервере.
Для этого шлется запрос на подтверждение, в виде списка имен файлов. И сервер уже асинхронно отвечает.
Я для каждого имени файла создаю AutoResetEvent и добавляю в коллекцию.
При каждом асинхронном ответе выставляю выставляю AutoResetEvent в true.
В потоке жду все ивенты в WaitHandle.WaitAll, после чего считаю, что все файлы есть на сервере.
Но есть вариант, что сервер не сможет ответить, соответственно мне нужно добавить таймер,
при срабатывании которого прекращать ожидание WaitHandle.
Есть идея просто делать WaitHandle.WaitAny и после этого проверять наличие ивентов в коллекции или срабатывание таймера.
Буду благодарен за идеи!
Re: Хитрый WaitHandle
От: QrystaL Украина  
Дата: 08.10.10 06:42
Оценка: 10 (1) +1
А>Но есть вариант, что сервер не сможет ответить, соответственно мне нужно добавить таймер,
А>при срабатывании которого прекращать ожидание WaitHandle.

Зачем такие сложности?

http://msdn.microsoft.com/en-us/library/cc190839.aspx
WaitHandle.WaitAll Method (WaitHandle[], Int32)

millisecondsTimeout
Type: System.Int32
The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.

Return Value
Type: System.Boolean
true when every element in waitHandles has received a signal; otherwise, false.
Re: Хитрый WaitHandle
От: Jolly Roger  
Дата: 08.10.10 06:55
Оценка:
Здравствуйте, Аноним, Вы писали:

Множество Event'ов здесь явно лишнее. Заведите один Event и счётчик. Изначально в счётчик записываете число файлов, при получении подтверждения

if (Interlocked.Decrement(...) == 0) Event.Set()


и ожидайте Event с таймаутом.
"Нормальные герои всегда идут в обход!"
Re: Хитрый WaitHandle
От: _FRED_ Черногория
Дата: 08.10.10 07:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть следующая ситуация.

А>На сервер отправляется несколько файлов. После сохранения файлов, надо проверить их наличие на сервере.
А>Для этого шлется запрос на подтверждение, в виде списка имен файлов. И сервер уже асинхронно отвечает.
А>Я для каждого имени файла создаю AutoResetEvent и добавляю в коллекцию.
А>При каждом асинхронном ответе выставляю выставляю AutoResetEvent в true.

А семафор не будет более умеснее? И ресурсы системные сэкономите.

А>В потоке жду все ивенты в WaitHandle.WaitAll, после чего считаю, что все файлы есть на сервере.

А>Но есть вариант, что сервер не сможет ответить, соответственно мне нужно добавить таймер,
А>при срабатывании которого прекращать ожидание WaitHandle.
А>Есть идея просто делать WaitHandle.WaitAny и после этого проверять наличие ивентов в коллекции или срабатывание таймера.

В WaitHandle.WaitAll можно указать таймаут.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Хитрый WaitHandle
От: Jolly Roger  
Дата: 08.10.10 07:30
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А семафор не будет более умеснее? И ресурсы системные сэкономите.


Дык вроде семафор для обратных ситуаций предназначен. А как его тут использовать, ведь меньше нуля нельзя указать?
"Нормальные герои всегда идут в обход!"
Re[2]: Хитрый WaitHandle
От: Аноним  
Дата: 08.10.10 07:58
Оценка:
Здравствуйте, QrystaL, Вы писали:
QL>Зачем такие сложности?

QL>http://msdn.microsoft.com/en-us/library/cc190839.aspx

QL>WaitHandle.WaitAll Method (WaitHandle[], Int32)

QL>millisecondsTimeout

QL>Type: System.Int32
QL>The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.

QL>Return Value

QL>Type: System.Boolean
QL>true when every element in waitHandles has received a signal; otherwise, false.
Оплошал. Забыл сказать, что используется свой протокол. То есть фактически таймер должен запускать не сразу после TCP соединения,
а после асинхронных ответов сервера о получении запроса на наличие файлов. Как то так
Re[3]: Хитрый WaitHandle
От: _FRED_ Черногория
Дата: 08.10.10 08:30
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

_FR>>А семафор не будет более умеснее? И ресурсы системные сэкономите.


JR>Дык вроде семафор для обратных ситуаций предназначен. А как его тут использовать, ведь меньше нуля нельзя указать?


Зарядить его на количество файлов, а при поступлении нотификации освобождать.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Хитрый WaitHandle
От: _FRED_ Черногория
Дата: 08.10.10 08:32
Оценка:
Здравствуйте, Аноним, Вы писали:

QL>>Зачем такие сложности?


QL>>http://msdn.microsoft.com/en-us/library/cc190839.aspx

QL>>WaitHandle.WaitAll Method (WaitHandle[], Int32)

А>Оплошал. Забыл сказать, что используется свой протокол. То есть фактически таймер должен запускать не сразу после TCP соединения,

А>а после асинхронных ответов сервера о получении запроса на наличие файлов. Как то так

На счёт тогго, почему нельзя использовать таймаут я не понял но: если считать ответы сервера через семафор, то есть через один единственный объект, то можно завести событие, которое выставлять тогда, когда нужно прекратить ждать ответов сервера и ждать уже не семафора, а WaitAny семафора или события.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Хитрый WaitHandle
От: Jolly Roger  
Дата: 08.10.10 08:49
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Зарядить его на количество файлов, а при поступлении нотификации освобождать.


Боюсь, я безнадёжно туплю Он-же вроде как раз свободен, пока его счётчик не обнулится, и любой поток, за ним обратившийся, его получит, одновременно уменьшив счётчик на единицу. То есть если счётчик будет изначально равен трём, то три вызова Wait завершатся сразу, и только 4-й станет ждать, пока кто-нибудь не вызовет Release... Нативный, по крайней мере, так работает А ТС вроде-же надо наоборот — ждать, пока не произойдёт N событий... Может быть (псевдо)кодом мне будет понятнее?
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.