我一直在寻找使用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和诸如此类 我想要的解决方案。
答案 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;
}