1

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

1 に答える 1

1

Henk の提案を使用して、タイマーを使用して次のように書き直しました。

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

client.Idle();

stopIdleTimeoutTimer.Dispose();

コードにアクセスできないライブラリであるため、 Idle メソッドの動作を変更することはできません

于 2011-07-07T21:02:53.667 に答える