检查Task.Run是否已经运行

时间:2015-02-17 04:58:33

标签: c# asynchronous

如何检查在 Task.Run 下运行的流程是否已经在运行?

private async void Window_PreviewKeyDown(object sender, KeyEventArgs e){ 
    //check goes here - abort if running 
    await Task.Run(() =>  myMath.Calculate() );
}

1 个答案:

答案 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;
    }
}

请注意,上面的内容有点尴尬。有可能有更好的机制来处理场景中已经运行的任务。但鉴于广泛的要求,我认为以上是一种合理的方法。