如果任务提前完成,有没有办法在不等待超时的情况下取消不可取消的C#任务?
我有一个无法控制的方法(假设它来自另一个库): 我想等待一段时间(例如20秒),如果作业没有在这段时间内完成,就停止代码如果任务提前完成,有没有办法在不等待超时的情况下取消不可取消的C#任务?,c#,.net,multithreading,task,cancellation,C#,.net,Multithreading,Task,Cancellation,我有一个无法控制的方法(假设它来自另一个库): 我想等待一段时间(例如20秒),如果作业没有在这段时间内完成,就停止代码 var thread = new Thread(DoWork); thread.Start(); Thread.Sleep(20000); thread.Abort(); 到目前为止,我所尝试的: 使用任务取消模式不是我的选择,因为我无法控制正在执行的方法 仅使用Task类不是一个选项,因为我无法在不使用取消令牌的情况下停止任务的执行 var taskToWaitAndK
var thread = new Thread(DoWork);
thread.Start();
Thread.Sleep(20000);
thread.Abort();
到目前为止,我所尝试的:
- 使用任务取消模式不是我的选择,因为我无法控制正在执行的方法
- 仅使用
类不是一个选项,因为我无法在不使用取消令牌的情况下停止任务的执行Task
var taskToWaitAndKill = Task.Factory.StartNew(DoWork); taskToWaitAndKill.Wait(20000); // 20 seconds // The task cannot be stopped (aborted) and still runs...
- 使用
类,等待它并中止它,这不是一个选项,因为我需要在停止代码之前等待所有的20秒线程
var thread = new Thread(DoWork); thread.Start(); Thread.Sleep(20000); thread.Abort();
var thread = new Thread(DoWork);
thread.Start();
Thread.Sleep(20000);
thread.Abort();
用不同的方式做,你可以做到:
var timeout = TimeSpan.FromSeconds(20);
var started = DateTime.UtcNow;
var thread = new Thread(DoWork);
thread.Start();
while (thread.IsAlive && DateTime.UtcNow - started < timeout)
{
Thread.Sleep(10);
// Do whatever here
}
// timeout occured, aborting
if (thread.IsAlive)
thread.Abort();
var timeout=TimeSpan.FromSeconds(20);
var start=DateTime.UtcNow;
var螺纹=新螺纹(销钉);
thread.Start();
while(thread.IsAlive&&DateTime.UtcNow-started<超时)
{
睡眠(10);
//在这里做什么都行
}
//发生超时,正在中止
if(thread.IsAlive)
thread.Abort();
但是,通过
Abort
终止线程是一种错误,可能会引起意外。如果您确实必须执行您无法控制的外来代码(例如第三方插件),那么您应该为它们创建一个外部代码。如果出现任何错误(包括ThreadAbortException
),您可以安全地卸载AppDomain
。必须中止操作吗?或者,当您继续工作时,它可以在后台继续吗?请参阅帮助。