贴一种取消任务的方式
using System;
using System.Threading;
using System.Threading.Tasks;
namespace CancellationDemo
{
class Program
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var longTask = new Task<int>(() => TaskMethod("task 1", 10, cts.Token), cts.Token);
Console.WriteLine(longTask.Status);
cts.Cancel();
Console.WriteLine(longTask.Status);
Console.WriteLine("first task has been cancelled before execution");
//任务被取消后再运行为非法
//longTask.Start();
//Console.WriteLine(longTask.Status);
//Console.WriteLine("----------------");
cts = new CancellationTokenSource();
longTask = new Task<int>(() => TaskMethod("task 2", 10, cts.Token), cts.Token);
longTask.Start();
for(int i = 0; i < 5; i ++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
//Thread.Sleep(TimeSpan.FromSeconds(3.5));
Console.WriteLine(longTask.Status);
}
Console.WriteLine("-----------------------");
cts.Cancel();
for (int i = 0; i < 5; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine(longTask.Status);
}
Console.WriteLine("a task has been completed with result {0}.", longTask.Result);
Console.ReadKey();
}
private static int TaskMethod(string name, int seconds, CancellationToken token)
{
Console.WriteLine("task {0} is running on a thread id {1}. Is thread pool thread: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
for(int i = 0;i < seconds; i ++)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
if (token.IsCancellationRequested)
return -1;
}
return 42 * seconds;
}
}
}