如何处理来自 运行 的多个异步方法?

How to handle mutiple async methods from running?

我如何知道异步(等待)操作是否已经 运行 并在应用程序中等待完成。我在一个视图中有两个按钮,每个按钮都绑定到两个不同的异步方法。如果单击 button1 并启动异步并等待其结果。那时如果单击 button2。我需要显示一条消息,表明已经存在 运行 异步方法,并停止执行第二个异步方法。我怎样才能做到这一点?

Task class 有一个 Status 属性 可用于评估异步操作是否为 运行 或已完成,甚至是否它处于故障状态。

存储任务并检查 IsCompleted 属性。

private Task pendingTask = Task.FromResult(0);

private async void Button1Click()
{
    if (!pendingTask.IsCompleted)
    {
        //Notify the user
        return;
    }

    pendingTask = DoSomethingAsync();
    await pendingTask;
    ...
}

private async  void Button2Click()
{
    if (!pendingTask.IsCompleted)
    {
        //Notify the user
        return;
    }

    pendingTask = DoSomethingElseAsync();
    await pendingTask;
    ...
}

正如@Peter Ritchie 在评论中指出的那样,更好的办法是在异步操作挂起时禁用另一个按钮。您可以考虑使用它。

您可以将执行的 Task 存储在您的表单中并查找其 Status 属性:

public class Form1
{
    private Task fooTask = Task.FromResult(0);

    public Task FooAsync()
    {
        return Task.FromResult(0);
    }

    public async void MyEventHandler(object sender, EventArgs e)
    {
        if (fooTask.Status == TaskStatus.Running)
        {
            // If we got here, the task is currently running. Notify someone
            return;
        }

        // If we're here, the task isn't running.
    }
}

请注意,这不会处理您的任务可能处于 FaultedCanceled 状态的情况,您可能也想处理这些情况。