CancellationToken Отмена не прерывается из BlockingCollection - PullRequest
14 голосов
/ 22 апреля 2011

У меня есть токен отмены, например, так:

   static CancellationTokenSource TokenSource= new CancellationTokenSource();

У меня есть блокирующая коллекция, вот так

BlockingCollection<object> items= new BlockingCollection<object>();

var item = items.Take(TokenSource.Token);

if(TokenSource.CancelPending)
   return;

Когда я звоню

TokenSource.Cancel();

Take делаетне продолжать, как следует.Если я использую TryTake с опросом, токен показывает, что он установлен как Отмененный.

1 Ответ

16 голосов
/ 23 апреля 2011

Это работает, как ожидалось.Если операция отменена, items.Take выдаст OperationCanceledException.Этот код иллюстрирует это:

static void DoIt()
{
    BlockingCollection<int> items = new BlockingCollection<int>();
    CancellationTokenSource src = new CancellationTokenSource();
    ThreadPool.QueueUserWorkItem((s) =>
        {
            Console.WriteLine("Thread started. Waiting for item or cancel.");
            try
            {
                var x = items.Take(src.Token);
                Console.WriteLine("Take operation successful.");
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Take operation was canceled. IsCancellationRequested={0}", src.IsCancellationRequested);
            }
        });
    Console.WriteLine("Press ENTER to cancel wait.");
    Console.ReadLine();
    src.Cancel(false);
    Console.WriteLine("Cancel sent. Press Enter when done.");
    Console.ReadLine();
}
...