这个后台线程的设计是否适用于在 .Net 4 中使用任务 API 运行? 我唯一担心的是,如果我们想要取消该任务,我该怎么做? 我知道可以将 ProgramEnding
设置为 true
,但是我知道任务 API 中有一个 CancellationToken
。
这只是一个示例代码,因此一个线程将添加到集合中,另一个线程将从集合中删除。 该任务被设置为长时间运行,因为它需要在程序运行时持续运行。
private void RemoveFromBlockingCollection()
{
while (!ProgramEnding)
{
foreach (var x in DataInQueue.GetConsumingEnumerable())
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}"
, Task.CurrentId, x + " Removed"
, Thread.CurrentThread.ManagedThreadId);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
DataInQueue = new BlockingCollection<string>();
var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection
, TaskCreationOptions.LongRunning);
for (int i = 0; i < 100; i++)
{
DataInQueue.Add(i.ToString());
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, i + " Added",
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(100);
}
ProgramEnding = true;
}
更新:我发现可以去掉ProgramEnding布尔变量,使用DataInQueue.CompleteAdding将线程结束。
.Token
作为参数提供了。;-) - Fischermaen