1

私はブロッキングライブラリーコールを持っています。メールを待っている長い実行中のサービスにあるimapアイドルです。私は妄想的で、電子メールを見逃すことはありません。アイドルコールは、StopIdleへの同時呼び出しによって取り消すことができます。私はそれがまだアイドリングしていると思えば、毎分コールStopIdleに次の方法を実装しました。TPLでメソッド呼び出しをブロックするためのタイムアウトを作成する

次のような方法がありますか?このメソッドは動作しますが、私はちょうど眠っているスレッドプールスレッドを束ねるようになります。ヘンクの提案を使用して

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

タイムアウトインディーまたはタイマーを使用してStopIdleを呼び出す方がよい。できるなら睡眠()を避けてください。 –

+0

解決方法があります:http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by-a-taskscheduler-unobser?lq=1 –

答えて

1

私はあることを、タイマーを使って書き直した:私は、コードへのアクセスを持っていないそのライブラリは、私はアイドルの動作を変更することはできませんので

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

client.Idle(); 

stopIdleTimeoutTimer.Dispose(); 

メソッド

関連する問題