如何处理多个异步方法?

时间:2015-03-11 12:36:40

标签: c# asynchronous windows-store-apps winrt-xaml winrt-async

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

Task类具有Status属性,可用于评估异步操作是否正在运行或已完成,或者即使它处于故障状态。

答案 2 :(得分:1)

您可以将已执行的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状态的情况,您也可能需要处理这种情况。