web-dev-qa-db-ja.com

新しいタスクを開始する前に、タスクが既に実行されているかどうかを確認してください

タスクで実行されるプロセスがあります。これらの複数を同時に実行したくありません。

これは、タスクが既に実行されているかどうかを確認する正しい方法ですか?

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                
        });
    }
}
32
Dave New

Jon Skeetが提案したように、Task.IsCompletedがより良いオプションです。

[〜#〜] msdn [〜#〜] によると:

タスクがIsCompletedRanToCompletion、またはFaultedの3つの最終状態のいずれかにある場合、Canceledはtrueを返します。

ただし、TaskStatus.WaitingForActivation状態でもtrueを返すようです。

34
Dave New
private Task task;

public void StartTask()
{
    if ((task != null) && (task.IsCompleted == false ||
                           task.Status == TaskStatus.Running ||
                           task.Status == TaskStatus.WaitingToRun ||
                           task.Status == TaskStatus.WaitingForActivation))
    {
        Logger.Log("Task is already running");
    }
    else
    {
        task = Task.Factory.StartNew(() =>
        {
            Logger.Log("Task has been started");
            // Do other things here               
        });
    }
}
12
Sayka

次の方法で確認できます。

if ((taskX == null) || (taskX.IsCompleted))
{
   // start Task
   taskX.Start();
   //or
   taskX = task.Factory.StartNew(() =>
   {
      //??
   }
}
2
guest123

さらに簡単:

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