NET问答: 如何取消或中止 Task 执行 ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET问答: 如何取消或中止 Task 执行 ?相关的知识,希望对你有一定的参考价值。
咨询区
Patrice Pezillier:
我在一个线程里创建了若干了task并开启执行,当我在业务逻辑中执行了 Thread.Abort()
之后,我发现这些 Task 并没有被终止掉?
问题来了,我如何将 Abort()
传递到内部的 Task 呢?
回答区
Darin Dimitrov:
你做不到的,Task默认就依托于底层线程池中的线程,同时用 Thread.Abort()
来中止线程也是不推荐的,在 Task 中推荐的做法是使用 cancellation tokens
,可参考如下代码:
class Program
{
static void Main()
{
var ts = new CancellationTokenSource();
CancellationToken ct = ts.Token;
Task.Factory.StartNew(() =>
{
while (true)
{
// do some heavy work here
Thread.Sleep(100);
if (ct.IsCancellationRequested)
{
// another thread decided to cancel
Console.WriteLine("task canceled");
break;
}
}
}, ct);
// Simulate waiting 3s for the task to complete
Thread.Sleep(3000);
// Can't wait anymore => cancel this task
ts.Cancel();
Console.ReadLine();
}
}
Florian Rappl:
之所以在中止Thread
后Task没有被终止的原因在于:你在Task中没有捕获到当前的 Thread ,如果做到了这点,那就可以完美解决了,参考如下代码:
void Main()
{
Thread thread = null;
Task t = Task.Run(() =>
{
//Capture the thread
thread = Thread.CurrentThread;
//Simulate work (usually from 3rd party code)
Thread.Sleep(1000);
//If you comment out thread.Abort(), then this will be displayed
Console.WriteLine("Task finished!");
});
//This is needed in the example to avoid thread being still NULL
Thread.Sleep(10);
//Cancel the task by aborting the thread
thread.Abort();
}
点评区
其实这是大家用多线程开发必然会遇到的一个问题,对 CancellationToken
的理解和运用还是非常重要的。
以上是关于NET问答: 如何取消或中止 Task 执行 ?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .NET 中取消 Task.Wait() 之后正在运行的 OpenAsync()?
System.Net.WebException:请求被中止:请求被取消