Task オブジェクトは、複数回実行したり、自由に開始および停止したりすることを意図したものではありません。タスクをキャンセルするか、完了まで実行する場合は、次にそのタスクを再度実行するときに新しい Task オブジェクトを作成する必要があります。タスク オブジェクトへの参照を保持し、CancellationTokenSource
.
タスクが bool 変数によって実行されているか、null 値がタスクが実行されていないことを示す Task 変数自体によって実行されているかを単純に追跡することをお勧めします。例えば:
private CancellationTokenSource _tokenSource = new CancellationTokenSource();
private Task _task;
public void StartDoingSomething()
{
if (_task == null)
{
_task = Task.Factory.StartNew(Worker, _tokenSource.Token)
.ContinueWith(_ => _task = null);
}
}
public void StopDoingSomething()
{
if (_task != null)
{
_tokenSource.Cancel();
}
}
private void Worker()
{
while (!_tokenSource.IsCancellationRequested)
{
// Do some unit of work
}
}