Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果任务提前完成,有没有办法在不等待超时的情况下取消不可取消的C#任务?_C#_.net_Multithreading_Task_Cancellation - Fatal编程技术网

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

如果任务提前完成,有没有办法在不等待超时的情况下取消不可取消的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

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

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

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();
    
所以我的问题是,在C语言中,有没有一种方法可以等待固定的毫秒数让代码执行,如果代码提前完成,就不要再等待了

使用Thread类,等待它并中止它不是一个选项,因为在停止代码之前我需要等待所有的20秒

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

必须中止操作吗?或者,当您继续工作时,它可以在后台继续吗?请参阅帮助。