使用WebForms和.NET 4.5的异步GUI等待/异步

时间:2014-10-14 21:18:48

标签: asp.net webforms async-await

我一直在寻找使用ASP.NET WebForms构建异步接口的任何简单示例。也就是说,当async方法完成时,await将呈现。

这是我一直在关注的例子之一How and When to use `async` and `await`。我一直在寻找的实现看起来像这样

protected async void button1_Click(object sender, EventArgs e)
{
    // Render when done
    textBox1.Text += await WaitAsynchronouslyAsync(RandomNumber(2000, 4000));

    // Render when done
    textBox1.Text += await WaitAsynchronouslyAsync(RandomNumber(100, 1000));
}

public async Task<string> WaitAsynchronouslyAsync(int delay)
{
    await Task.Delay(delay);
    return string.Concat(delay, "; ");
}
private int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

然而,这将始终在一切都完成时呈现,但同时也是如此。在上面的示例中,所需的结果将是第一次调用之前第二次调用WaitAsynchronouslyAsync,因为它总是会减少延迟。

或者甚至可以使用webforms?我知道如何在JavaScript中使用webapi,websockets和诸如此类 我想要的解决方案。

2 个答案:

答案 0 :(得分:2)

正如我在博客中描述的那样,async does not change the HTTP protocol

HTTP为每个请求提供一个响应。因此,当HTTP请求到达时,它必须在发送响应之前执行您的页面完成

在ASP.NET世界中,await 屈服于客户端/浏览器。相反,它产生ASP.NET运行时。在看到您的处理全部完成之前,ASP.NET不会发送响应。

如果您想动态更新页面(或部分渲染一个页面),那么您需要使用适当的技术(SignalR,UpdatePanel等)自行完成。

答案 1 :(得分:1)

以您的方式使用await时,执行流程是顺序的。第一个await,只有在完成后才会执行第二个await

如果您希望它们同时执行 ,您可以启动这两个操作并使用Task.WhenAny并分配任何先完成任务的值:

Task<string> slowerTask = WaitAsynchronouslyAsync(RandomNumber(2000, 4000));
Task<string> fasterTask = WaitAsynchronouslyAsync(RandomNumber(100, 1000));

List<Task<string>> tasks = new List<Task<string>> { slowerTask, fasterTask };

while (tasks.Count > 0)
{
     Task<string> finishedTask = await Task.WhenAny(tasks);
     tasks.Remove(finishedTask);

     textBox1.Text = await finishedTask;
}