如何取消.NET后台线程的执行
在开发.NET中常常需要使用后台线程实现任务的异步执行。但是有时候需要在任务执行期间取消线程的执行,以下是.NET中取消后台线程的方法。
CancellationTokenSource
CancellationTokenSource可以用来取消线程执行,在需要取消执行的时候调用CancellationTokenSource.Cancel()方法即可。下面是示例代码:
using System;
using System.Threading;
class Program
{
static void Main()
{
// 创建并开启后台线程
CancellationTokenSource cts = new CancellationTokenSource();
Thread thread = new Thread(new ParameterizedThreadStart(DoWork));
thread.IsBackground = true;
thread.Start(cts.Token);
// 等待用户输入字符,当用户输入“c”时取消线程执行
Console.WriteLine("Press 'c' to cancel the operation...");
if (Console.ReadKey().KeyChar == 'c')
{
cts.Cancel();
}
}
static void DoWork(object data)
{
CancellationToken token = (CancellationToken)data;
while (!token.IsCancellationRequested)
{
Console.Write(".");
Thread.Sleep(100);
}
}
}
在上面的示例代码中,我们首先创建了CancellationTokenSource的实例,并且开启了一个后台线程来执行任务。通过Console.ReadKey()方法获取用户的输入来决定是否取消任务的执行。如果用户输入字符“c”,就调用CancellationTokenSource.Cancel()方法来取消线程的执行。
在DoWork方法中,我们通过传入的CancellationToken来判断任务是否被取消了,如果任务没有被取消就继续执行任务。
Task
在.NET 4.0及以上版本中,可以使用Task类和CancellationToken来取消线程执行。使用Task的好处是可以更容易地管理线程状态。下面是示例代码:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// 创建并开启后台线程
CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() => DoWork(cts.Token), cts.Token);
// 等待用户输入字符,当用户输入“c”时取消线程执行
Console.WriteLine("Press 'c' to cancel the operation...");
if (Console.ReadKey().KeyChar == 'c')
{
cts.Cancel();
}
}
static void DoWork(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
Console.Write(".");
Thread.Sleep(100);
}
}
}
在上面的示例代码中,我们使用Task类的Factory.StartNew方法创建了一个后台线程,并且传入了CancellationToken来控制任务的取消。在DoWork方法中,我们通过CancellationToken来判断任务是否被取消了。
当用户按下“c”键时,我们调用CancellationTokenSource的Cancel方法来取消线程的执行。
以上是.NET中取消后台线程的两种方法。如果你需要在任务执行过程中能够动态地取消线程的执行,你可以使用以上两种方法来实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何取消.net后台线程的执行 - Python技术站