如何检查在 Task.Run 下运行的流程是否已经在运行?
private async void Window_PreviewKeyDown(object sender, KeyEventArgs e){
//check goes here - abort if running
await Task.Run(() => myMath.Calculate() );
}
答案 0 :(得分:5)
Task.Run()
方法返回Task
个对象。您可以,而不是立即使用await
,将Task
对象引用分配给变量,稍后您可以使用该变量来检查其状态。
例如:
private Task _task;
private async void Window_PreviewKeyDown(object sender, KeyEventArgs e){
//check goes here - abort if running
if (_task != null && !_task.IsCompleted)
{
// Your code here -- use whatever mechanism you deem appropriate
// to interrupt the Calculate() method, e.g. call Cancel() on
// a CancellationToken you passed to the method, set a flag,
// whatever.
}
Task task = Task.Run(() => myMath.Calculate());
_task = task;
await _task;
if (task == _task)
{
// Only reset _task value if it's the one we created in this
// method call
_task = null;
}
}
请注意,上面的内容有点尴尬。有可能有更好的机制来处理场景中已经运行的任务。但鉴于广泛的要求,我认为以上是一种合理的方法。