Создать тайм-аут для блокировки вызова метода с TPL - PullRequest
1 голос
/ 07 июля 2011

У меня есть блокирующий вызов библиотеки, режим ожидания 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();
}

1 Ответ

1 голос
/ 08 июля 2011

Используя предложение Хенка, я переписал его, используя таймер:

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

client.Idle();

stopIdleTimeoutTimer.Dispose();

Поскольку это библиотека, к которой у меня нет доступа к коду, я не могу изменить поведение метода Idle

...