我有一个多线程应用程序,我需要在一定时间后取消每个任务,即使在取消时,他们使用非托管资源.现在我使用以下代码(例如,控制台应用程序).在实际应用中,延迟可能发生在非托管资源中.
static void Main()
{
for (int i = 0; i < 10; i++)
{
Task.Factory.StartNew(Do, TaskCreationOptions.LongRunning);
}
Console.ReadLine();
}
private static void Do()
{
new Timer(Thread.CurrentThread.Abort, null, 1000, -1);
try
{
Console.WriteLine("Start " + Task.CurrentId);
Thread.Sleep(2000);
Console.WriteLine("End " + Task.CurrentId);
}
catch (Exception)
{
Console.WriteLine("Thread Aborted " + Task.CurrentId);
}
}
Run Code Online (Sandbox Code Playgroud)
得到结果:

但从安全角度来看,我不确定它是否适合真正的应用.我也在不同的变种中使用了CancellationToken,但是它没有给我正确的结果,因为我在使用CancellAfter()或.Delay()时使用了时间跨度并且在获得时间后取消任务我获得了以下结果:
static void Main()
{
for (int i = 0; i < 10; i++)
{
var clt = new CancellationTokenSource();
Task task = new Task(() =>
{ …Run Code Online (Sandbox Code Playgroud)