我正在学习异步等待并在我的旧 asp.net 中实现。我正在使用 C# 4.6。
现在添加async-await后页面始终同步运行。它正在等待 api 发回结果,然后在屏幕上显示消息。
我正在寻找的是页面启动线程并响应(我可以在上面做其他事情)。完成后,它会显示结果。
下面是我的按钮点击、HTTP 调用(这将启动异步请求)和 API 方法。
我有
- 遵循示例 https://msdn.microsoft.com/en-us/library/hh191443.aspx
- 在 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/