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



我正在学习异步等待,并在旧的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();
            }
        }
    }

API

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调用。这将为您提供您正在寻找的行为,其中可以在"后台"运行一个长请求,同时让您的客户端应用程序继续执行其他操作。然后,当操作完成时,服务器最终会给您回电话,然后您可以使用响应数据来显示结果或通知用户。

最新更新