任务对象并不意味着可以多次运行并随意启动和停止。如果您取消一个任务或它运行完成,您将在下次想要再次执行它时创建一个新的任务对象。您可以保留对任务对象的引用并使用CancellationTokenSource
.
我建议简单地跟踪任务是否由布尔变量或任务变量本身运行,其中空值表示任务未运行。例如:
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
}
}