タスクで実行されるプロセスがあります。これらの複数を同時に実行したくありません。
これは、タスクが既に実行されているかどうかを確認する正しい方法ですか?
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が提案したように、Task.IsCompleted
がより良いオプションです。
[〜#〜] msdn [〜#〜] によると:
タスクが
IsCompleted
、RanToCompletion
、またはFaulted
の3つの最終状態のいずれかにある場合、Canceled
はtrueを返します。
ただし、TaskStatus.WaitingForActivation
状態でもtrueを返すようです。
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
});
}
}
次の方法で確認できます。
if ((taskX == null) || (taskX.IsCompleted))
{
// start Task
taskX.Start();
//or
taskX = task.Factory.StartNew(() =>
{
//??
}
}
さらに簡単:
if (task?.IsCompleted ?? true)
task = TaskFunction();