У меня есть блокирующий вызов библиотеки, режим ожидания imap, который будет в долгосрочном сервисе, ожидающем электронную почту, я параноик и не верю, что библиотека никогда не пропустит электронную почту. Простой вызов может быть отменен одновременным вызовом StopIdle. Я реализовал следующий способ для каждой минуты вызова StopIdle, если он думает, что он все еще бездействует.
Есть ли лучший способ сделать следующее? Этот метод работает, но мне кажется, что в итоге я займусь кучей потоков пула потоков, просто спящих.
while (true)
{
// read unseen emails here ...
var cancelSource = new CancellationTokenSource();
var cancelToken = cancelSource.Token;
Task stopIdleOccasionally = Task.Factory.StartNew(() =>
{
Thread.Sleep(TimeSpan.FromMinutes(1));
if (cancelToken.IsCancellationRequested)
{
return;
}
client.StopIdle(); // This causes the Idle() call to return
},
cancelSource.Token);
client.Idle(); // This is the blocking call that I want to create a timeout for
cancelSource.Cancel();
}