C# 如何处理运行中的多个异步方法?

C# 如何处理运行中的多个异步方法?,c#,asynchronous,windows-store-apps,winrt-xaml,winrt-async,C#,Asynchronous,Windows Store Apps,Winrt Xaml,Winrt Async,我如何知道异步(可等待)操作是否已经在运行并等待应用程序中完成。我在一个视图中有两个按钮,每个按钮绑定到两个不同的异步方法。如果单击按钮1,异步启动并等待其结果。此时,如果单击按钮2。我需要显示一条消息,说明已经有一个正在运行的异步方法,并停止第二个异步方法的执行。我怎样才能做到这一点 任务类有一个属性,可用于评估异步操作是否正在运行、是否已完成或是否处于故障状态。存储任务并检查IsCompleted属性 private Task pendingTask = Task.FromResult(0)

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

任务
类有一个属性,可用于评估异步操作是否正在运行、是否已完成或是否处于故障状态。

存储任务并检查
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在评论中指出的,更好的方法是在异步操作挂起时禁用另一个按钮。你可以考虑使用它。

你可以在你的表单中存储执行的<代码>任务>代码>查找它的代码>状态< /代码>属性:

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.
    }
}

注意,这不考虑任务可能处于
故障
取消
状态的情况,您可能也需要处理这些情况。

您正在运行的异步操作是否可以取消?禁用按钮启动任务似乎是一个更好的主意;不能单击已禁用的按钮。如果可以,任务就完成了。@PeterRitchie是的,非常好的主意。noob,考虑一下这是一个更好的选择。我想在点击第二个按钮时显示一条消息,如“已在运行”。如果按钮被禁用,我将无法捕捉该事件。斯利拉姆提到的方法似乎很好。让我先试试。