【问题标题】:Create timeout for blocking method call with TPL使用 TPL 为阻塞方法调用创建超时
【发布时间】: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();
}

【问题讨论】:

标签: c# .net imap task-parallel-library cancellationtokensource


【解决方案1】:

根据 Henk 的建议,我使用计时器将其重写为:

Timer stopIdleTimeoutTimer = new Timer(
    _ => client.StopIdle(),
    null,
    TimeSpan.FromMinutes(1),
    TimeSpan.FromMilliseconds(-1));

client.Idle();

stopIdleTimeoutTimer.Dispose();

由于它是一个我无法访问代码的库,因此我无法更改 Idle 方法的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2010-12-26
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多