我有一个无法控制的方法(假设它来自另一个库):
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
。