【发布时间】:2011-07-07 16:42:03
【问题描述】:
我有一个阻塞的库调用,一个 imap 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();
}
【问题讨论】:
-
最好使用超时 insdie Idle 或 Timer 来调用您的 StopIdle。如果可以,请避免使用 Sleep()。
标签: c# .net imap task-parallel-library cancellationtokensource