在我的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);
}
}
}
}
如果我想停止任务,怎么办? 我听说过“取消令牌”,但不知道如何将其应用于案例。
答案 0 :(得分:3)
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();
另外,您可能需要查看这些博文: