Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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#_Multithreading_Task_Task Parallel Library - Fatal编程技术网

C# 如何强制取消任务?

C# 如何强制取消任务?,c#,multithreading,task,task-parallel-library,C#,Multithreading,Task,Task Parallel Library,假设存在一个包含以下操作的任务: Task someTask = new Task(() => { while(!IsCancellationRequested) { Do_something_over_a_long_period_of_time(); token.ThrowIfCancellationRequested(); Do_something_over_a_long_period_of_time(); token.ThrowIfCance

假设存在一个包含以下操作的任务:

Task someTask = new Task(() => {

  while(!IsCancellationRequested) {

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();
  }
});
someTask.Start();
还有相当不耐烦的用户。他们渴望立即终止我的申请。他们不想在长操作运行时等待

我曾经使用
Thread
类,并且能够通过调用
abort()
命令立即中止所有线程

如何立即中止任务


谢谢。

您不能以不合作的方式强制任务中止。以不受控制的方式中止线程是不安全的,因此故意不支持

你应该让你的
Do\u some\u over \u long \u period \u of \u time
呼叫可以取消(即,向他们传递令牌,并让他们定期检查)

编辑:如另一个答案中所述,您可以通过确保所有前台线程都已终止来终止应用程序。但你需要意识到,你的任务不一定有机会彻底结束。如果他们正在做诸如写入文件之类的事情,您可能希望等到取消被注意到,以避免破坏持久化状态

他们渴望立即终止我的申请。他们不想在长时间操作运行时等待

默认情况下,任务作为后台任务在线程池上运行。您可以安全地退出应用程序,而不必担心后台线程

因此,只要您想退出流程,就没有问题


请注意,Thread.Abort()很快,但不安全。即使对于一个退出的应用程序来说也不是这样,但是这样做很少会引起真正的问题

“你看过背景工作者吗?”哈德利希望背景工作者如何解决他的问题。它以类似于任务的方式支持取消我不认为我会说“没有问题”-如果其中一个后台线程正在编写下一次启动应用程序时所需的文件,该怎么办?我已经忘记了线程池和后台任务。现在很好用。谢谢,谢谢。这对我来说非常有用。因此,如果我启动一个新任务,它只调用一个方法getDataThatsRunsforthenext40secs(),那么就没有办法从外部立即取消该任务了?这样取消的结果并不重要,但我希望我的CPU能尽快做一些有用的事情。想法?@Gishu:如果没有相关任务的配合,我不知道有什么方法可以安全地完成任务。在一天结束时,
在很长一段时间内做一些事情
可能是一个第三方库调用,您无法修改以配合取消。因此,能够强制取消这类任务仍然是一个合法的现实世界要求。是的,杀死它的线程可能是安全的,也可能不是安全的,这取决于函数正在做什么工作(I/O等),但必须有一个最好的方法来解决这个问题,而不是“不要做”。我同意任意代码不能被安全终止。我脑海中有一个特定的场景:我们正在运行一个CPU密集型的数学“解算器”,它可能需要几分钟才能运行。它只处理数字,最终返回结果,但不进行I/O(尽管它可能会分配非托管内存等)。我们必须能够取消此操作,但无法更改库。我们该怎么办?我认为最好的解决方案是每个计算单独处理,或者可能是一个AppDomain?