如果任务提前完成,有没有办法取消不可取消的C#任务而不等待超时



我有一个无法控制的方法(假设它来自另一个库):

private static void DoWork()
{
    // I have no control over this method
    while (true)
    {
        Console.WriteLine("Still working");
    }
}

我想等待一段时间(例如20秒),如果作业在这段时间内没有完成,就停止代码。

到目前为止我尝试过的:

  • 使用任务取消模式对我来说不是一个选择,因为我无法控制执行的方法

  • 只使用Task类不是一个选项,因为如果不使用取消令牌,我就无法停止任务的执行

    var taskToWaitAndKill =
        Task.Factory.StartNew(DoWork);
    taskToWaitAndKill.Wait(20000); // 20 seconds
    // The task cannot be stopped (aborted) and still runs...
    
  • 使用Thread类,等待并中止它不是一个选项,因为我需要等待20秒才能停止代码。

    var thread = new Thread(DoWork);
    thread.Start();
    Thread.Sleep(20000);
    thread.Abort();
    

因此,我的问题在C#中有没有一种方法可以等待固定毫秒数的代码执行,如果代码提前完成,就不再等待了

使用Thread类,等待并中止它不是一个选项,因为我需要等待20秒才能停止代码。

用不同的方式做,你就能做到:

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();

然而,用Abort杀死线程是一个危险的操作,可能会引起意外。如果你真的必须执行你无法控制的外来代码(例如第三方插件),那么你应该为它们创建一个AppDomain。如果出现任何错误(包括ThreadAbortException),您可以安全地卸载AppDomain

最新更新