c# - 异步等待按钮单击始终同步运行

标签 c# asp.net multithreading asynchronous async-await

我正在学习异步等待并在我的旧 asp.net 中实现。我正在使用 C# 4.6。

现在添加async-await后页面始终同步运行。它正在等待 api 发回结果,然后在屏幕上显示消息。

我正在寻找的是页面启动线程并响应(我可以在上面做其他事情)。完成后,它会显示结果。

下面是我的按钮点击、HTTP 调用(这将启动异步请求)和 API 方法。

我有

  1. 遵循示例 https://msdn.microsoft.com/en-us/library/hh191443.aspx
  2. 在 StackOverflow 和其他论坛上寻找解决方案。我相信我正在以同样的方式做这件事(当然我不是 :( ))。

在 aspx 页面上添加了 Async="true"

按钮点击

protected async void btnCopy_Click(object sender, EventArgs e)
    {
        await RunAsync(Guid.Parse(SourceBusinessID), Guid.Parse(DestinationBusinessID), false);

        if (lblError.Text == "")
        {
            lblError.Text = "Copy Completed!";
        }            
    }

public async Task RunAsync( Guid SourceBusinessID, Guid DestinationBusinessID,bool copyAdviser)
    {
        using (var client = new HttpClient())
        {
            var request = new HttpRequestMessage()
            {
                RequestUri = new Uri("http://localhost:52140/api/DummyAccounts/"),
                Method = HttpMethod.Get,
            };
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

            client.Timeout = TimeSpan.FromSeconds(500);

            var response = await client.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {                    
                lblError.Text = response.StatusCode.ToString();
            }
        }
    }

应用程序接口(interface)

public IHttpActionResult Get(Guid sourceBusinessID, Guid destinationBusinessID,bool copyAdviser = true)
    {
        try
        {
            CopyHelper.SourceBusinessID = sourceBusinessID;
            CopyHelper.DestinationBusinessID = destinationBusinessID;
            CopyHelper.CopyAdviser = copyAdviser;

            logger.Info("Copy buisness started:" + DateTime.Now);

            bool status = CopyBusinessService.CopyBusiness(CopyHelper.SourceBusinessID, CopyHelper.DestinationBusinessID, CopyHelper.CopyAdviser);
            if (status)
            {
                logger.Info("Copy business finished:" + DateTime.Now);

                return Ok(true);
            }
            else
            {
                logger.Info("Copy business failed:" + DateTime.Now);

                return Ok(false);
            }
        }
        catch (Exception ex)
        {
            return InternalServerError(ex);
        }

    }

任何帮助将不胜感激。

最佳答案

WebForms 应用程序中的异步不会使您的表单表现得像一个客户端应用程序,它位于事件循环中并等待事件发生。它仍然是一个服务器呈现的页面,响应由按钮单击或更改事件触发的单个事务性 HTTP 请求,以及由 WebForm 提供的单个服务器呈现的 HTML 响应。一旦呈现页面就完成了。没有等待下一次点击的“事件循环”。

WebForms/ASP.NET 应用程序中的异步仅允许您从主线程卸载一些处理,但它不会更改页面上 UI 的行为。将异步视为同时运行多个操作或释放主处理线程的方法,同时在后台运行较长时间的 IO 操作,然后在呈现最终页面之前返回。

但它对页面实际呈现到浏览器或行为的方式没有任何作用——WebForms 页面仍然是一个纯粹的服务器呈现页面,它通过 HTTP 回发处理事件。就浏览器而言,这是一个事务性请求:无论您是否在后端使用 Async,您单击一个按钮,页面都会重新呈现。

解决问题的方法是使用客户端 JS 框架来管理应用程序的异步流并对服务器进行异步 HTTP 调用。这将为您提供您正在寻找的行为,其中一个长请求可以“在后台”运行,同时让您的客户端应用程序继续执行其他操作。然后,服务器最终会在操作完成时回调您,然后您可以使用响应数据来显示结果或通知用户。

关于c# - 异步等待按钮单击始终同步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36710906/

相关文章:

c# - 如何使用 wait 或 thread 等到事件发生

c# - 如何在显示应用程序主窗口之前运行可执行文件?

c# - WCF:使用什么超时属性?

c# - dotnet 核心 Web 应用程序单元测试 Controller

C#/ASP.NET Selenium WebDriver - 重复使用 Cookie

c# - 无法在 visual studio-15 中更改安装项目的平台

jquery - 在 jquery 中更新 asp.net 数据网格的 css

c# - 如何从 ViewStart 中访问(自定义)Web 助手?

javascript - 通过 javascript 使用 Sitecore 发布表单

c++ - 在 Windows 中等待 std::atomic<int> 的正确方法?