私はブロッキングライブラリ呼び出し、電子メールを待っている長時間実行されるサービスになるimap Idleを持っています. Idle 呼び出しは、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();
}