Так как я не смог найти какое-либо хорошее решение, я решил проблему вручную, создав System.Threading.Timer
с кодом, подобным следующему:
System.Threading.Timer t;
bool timeout;
[...]
// Initialization
t = new Timer((s) => {
lock (this) {
timeout = true;
Disconnected();
}
});
[...]
// Before each asynchronous socket operation
t.Change(10000, System.Threading.Timeout.Infinite);
[...]
// In the callback of the asynchronous socket operations
lock (this) {
t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
if (!timeout) {
// Perform work
}
}
Это также обрабатывает случаи, когда происходит тайм-аут, которыйсоздается простым запаздыванием и позволяет немедленному возврату обратного вызова, если операция заняла слишком много времени.