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

C# 在启动新任务之前,请检查任务是否已在运行

C# 在启动新任务之前,请检查任务是否已在运行,c#,.net,parallel-processing,task-parallel-library,C#,.net,Parallel Processing,Task Parallel Library,有一个在任务中执行的流程。我不希望同时执行其中的多个 这是检查任务是否已在运行的正确方法吗 private Task task; public void StartTask() { if (task != null && (task.Status == TaskStatus.Running || task.Status == TaskStatus.WaitingToRun || task.Status == TaskStatus.WaitingForActivation

有一个在任务中执行的流程。我不希望同时执行其中的多个

这是检查任务是否已在运行的正确方法吗

private Task task;

public void StartTask()
{
    if (task != null && (task.Status == TaskStatus.Running || task.Status == TaskStatus.WaitingToRun || task.Status == TaskStatus.WaitingForActivation))
    {
        Logger.Log("Task has attempted to start while already running");
    }
    else
    {
        Logger.Log("Task has began");

        task = Task.Factory.StartNew(() =>
        {
            // Stuff                
        });
    }
}

正如Jon Skeet所建议的那样,
任务.IsCompleted
是更好的选择

根据:

IsCompleted
当任务位于三个选项之一时,将返回true 最终状态:
RanToCompletion
Faulted
cancelled

但在任务状态下,它似乎返回true。等待激活状态也返回true。

您可以通过以下方式进行检查:

if ((taskX == null) || (taskX.IsCompleted))
{
   // start Task
   taskX.Start();
   //or
   taskX = task.Factory.StartNew(() =>
   {
      //??
   }
}
更简单的是:

if (task?.IsCompleted ?? true)
    task = TaskFunction();

考虑使用<代码>任务。iStime——但请记住,这里总是有一个竞赛条件。如果任务在您检查后立即完成,您将不会在下次运行它-可以吗?或者你真的想在第一项任务完成后立即开始第二项任务吗?啊,我没有看到
task.IsComplete
。是的,比赛条件不是问题。谢谢,您可以随意创建一个答案。@davenewza,您可能想看看“在
任务状态中似乎返回true。也在等待激活
状态”是什么意思?MSDN文档没有说明:“当任务处于三种最终状态之一时,IsCompleted将返回true:RanToCompletion、Faulted或Cancelled。”在死锁情况下,即使任务的状态为WaitingForActivation,任务也可以“完成”@PoulBak——我在谷歌上搜索了一下,但没有发现有人提到你说的是可能的。推荐人?我试过了,所以我知道。当任务完成后,等待将上下文切换回UI线程时,即会发生(如果出现死锁)。请最小化复制测试用例。更简单的是:
if(task?.IsCompleted)
(您不需要
==true
),除非
task?.IsCompleted
生成可为空的布尔值。无论哪种情况,task.IsCompleted都不是一个充分的检查@萨伊卡有更好的答案。@MarkMintoff这是真的<代码>如果(task?.IsCompleted??false)
应该更好为什么要添加TaskStatus.Running等的测试?根据定义,在这些情况下,
IsCompleted
不就是
false
?也就是说,从文档中可以看出,测试
IsCompleted
已经足够了,而那些其他测试是多余的(已经包含在
IsCompleted
test中)。@ToolmakerSteve。我很抱歉,我不记得我为什么这么做了,因为我5年前写过这篇文章。无论如何,这是c#,因此对于OR语句,一旦发现task.IsCompleted为false,程序将跳过其他测试。另外,SOF是一个程序员的教育网站,因此通过这段代码,他们可以快速查看任务的不同状态。我不明白这一点-在任务运行之前,您无法检查任务的状态,否则您将得到一个异常,即对象未初始化。一旦它在运行,检查status=running就太晚了,因为它是。我想我错过了一些非常明显的东西。。。但我不能做任何事what@Journeyman1234一项已完成的任务并不意味着它已被销毁。这意味着,任务已经完成,它正在休息。任务的其他状态为等待、中断、运行等。。在这些状态下,任务的实例仍将存在。您描述的状态将是当任务从未启动(调用/启动)时。在该状态下,它将不在任务列表中。因此,对它的搜索将返回null。这段代码还包括当它为空时该怎么做的指令。@Sayka谢谢你,伙计,我同时也弄明白了,现在一切都很好:)
if (task?.IsCompleted ?? true)
    task = TaskFunction();