我有一个正在运行的任务,需要创建一个用户可以随时停止正在运行的任务的功能。我试过token.Cancel();但仍然没有用。
这是我的代码:
var task = new Task(new Action(Method), tokenSource2.Token);
var cToken = tokenSource2.Token;
cToken.Register(() => cancelNotification());
// code to stop the running task .. button click event
if (tokenSource2 != null)
{
tokenSource2.Cancel();
}
答案 0 :(得分:3)
我相信取消令牌可以正常工作,因为任务正文需要接受取消令牌并不断检查逻辑的每一步之间是否已被取消。 See here for more details
此示例摘自该文档,并概述了如何检查取消令牌的状态。
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// Create the token source.
CancellationTokenSource cts = new CancellationTokenSource();
// Pass the token to the cancelable operation.
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), cts.Token);
Thread.Sleep(2500);
// Request cancellation.
cts.Cancel();
Console.WriteLine("Cancellation set in token source...");
Thread.Sleep(2500);
// Cancellation should have happened, so call Dispose.
cts.Dispose();
}
// Thread 2: The listener
static void DoSomeWork(object obj)
{
CancellationToken token = (CancellationToken)obj;
for (int i = 0; i < 100000; i++) {
if (token.IsCancellationRequested)
{
Console.WriteLine("In iteration {0}, cancellation has been requested...",
i + 1);
// Perform cleanup if necessary.
//...
// Terminate the operation.
break;
}
// Simulate some work.
Thread.SpinWait(500000);
}
}
}
// The example displays output like the following:
// Cancellation set in token source...
// In iteration 1430, cancellation has been requested...