【问题标题】:Async GUI using WebForms and .NET 4.5 await/async使用 WebForms 和 .NET 4.5 等待/异步的异步 GUI
【发布时间】:2014-12-09 19:39:38
【问题描述】:

我一直在寻找任何使用 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 进行渲染,因为它总是会减少延迟。

或者甚至可以使用网络表单?我确实知道如何在 JavaScript 中使用 webapi、websockets 和诸如此类的东西来做到这一点,这不是我目前想要的解决方案。

【问题讨论】:

    标签: asp.net webforms async-await


    【解决方案1】:

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

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

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

    如果您想动态更新页面(或部分呈现页面),则需要使用适当的技术(SignalR、UpdatePanel 等)自己完成。

    【讨论】:

    • 啊,数字。我希望有一些我可以使用的库来简化处理。但是由于这些方法及其实现是异步的(并且会运行到最后),我所需要的只是一个状态更改机制,只要方法的状态发生更改,我想它就会更新页面。
    【解决方案2】:

    当您以您的方式使用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;
    }
    

    【讨论】:

    • @EricHerlitz 抱歉,在手机上。编辑了我的代码。
    • 它以一种方式工作,下一步是弄清楚是否有任何方法可以使 Web 控件异步
    • 如果我关闭页面,方法仍在运行事件,但页面不会异步更新文本框
    • 我不太清楚你的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多