Вот как я это сделал (хотя мне не понравилось решение):
идея состоит в том, чтобы иметь один таймер, который при срабатывании проверяет все ожидающие операции на время ожидания.Я создал интерфейс, который реализует мой асинхронный клиент:
public interface ITimeoutable {
event Action<ITimeoutable, Operation> Begin;
event Action<ITimeoutable, Operation> End;
void DoTimeout(Operation operation);
}
, где Operation - это enum, определяемый как:
public enum Operation {
Connect,
Send,
Receive,
Disconnect
}
, поэтому клиент вызывает событие Begin
при запускеасинхронная операция и вызывает событие End
по завершении.С другой стороны, я создал TimeoutManager, в котором есть коллекция асинхронных клиентов и словарь с операциями и моментом их запуска.Когда создается новый клиент, он регистрируется в TimeoutManager
, который подписывается на события.TimeoutManager
использует System.Threading.Timer
для проверки тайм-аута операций.Если время ожидания истекло, вызывается метод DoTimeout
(из интерфейса ITimeoutable
).
Это довольно сложный код, и он мне не нравится.Но это работает.