停止/取消正在运行的线程

时间:2014-01-09 14:11:12

标签: c# multithreading c#-4.0

在我的Windows服务应用程序中,我启动了多个线程:

class ConsumingEnumerableDemo
{
   // Demonstrates: 
   //      BlockingCollection<T>.Add() 
   //      BlockingCollection<T>.CompleteAdding() 
   //      BlockingCollection<T>.GetConsumingEnumerable() 
   public static void BC_GetConsumingEnumerable()
   {
       using (BlockingCollection<int> bc = new BlockingCollection<int>())
       {

           // Kick off a producer task
           Task.Factory.StartNew(() =>
           {
               for (int i = 0; i < 10; i++)
               {
                   bc.Add(i);
                   Thread.Sleep(100); // sleep 100 ms between adds
               }

               // Need to do this to keep foreach below from hanging
               bc.CompleteAdding();
           });

           // Now consume the blocking collection with foreach. 
           // Use bc.GetConsumingEnumerable() instead of just bc because the 
           // former will block waiting for completion and the latter will 
           // simply take a snapshot of the current state of the underlying collection. 
           foreach (var item in bc.GetConsumingEnumerable())
           {
               Console.WriteLine(item);
           }
        }
      }
    }

如果我想停止任务,怎么办? 我听说过“取消令牌”,但不知道如何将其应用于案例。

1 个答案:

答案 0 :(得分:3)

只需定义Cancellation Token Source

即可
var cts = new CancellationTokenSource();

并像这样使用它:

 Task.Factory.StartNew(() =>
        {
            for (int i = 0; i < 10; i++)
            {
                bc.Add(i);
                Thread.Sleep(100); // sleep 100 ms between adds
                cts.ThrowIfCancellationRequested();
            }

            // Need to do this to keep foreach below from hanging
            bc.CompleteAdding();
        },cts.Token);

如果要取消任务,请使用:

cts.Cancel();

另外,您可能需要查看这些博文:

  1. Parallel Programming: Task Cancellation
  2. Async in 4.5: Enabling Progress and Cancellation in Async APIs