C# 异步等待按钮单击始终同步运行
我正在学习AsyncWait,并在旧的asp.net中实现它。我使用的是C4.6 现在,页面在添加async Wait后始终同步运行。它正在等待api发回结果,然后在屏幕上显示消息 我要找的是,这个页面启动了一个线程,我可以在上面做其他的事情。完成后,将显示结果 下面是我的按钮单击,HTTP调用,它将启动异步req和API方法 我有 仿效 在StackOverflow和其他论坛上寻找解决方案。我相信我是用同样的方式做的,当然我不是。 在aspx页面上添加了Async=true 按钮点击C# 异步等待按钮单击始终同步运行,c#,asp.net,multithreading,asynchronous,async-await,C#,Asp.net,Multithreading,Asynchronous,Async Await,我正在学习AsyncWait,并在旧的asp.net中实现它。我使用的是C4.6 现在,页面在添加async Wait后始终同步运行。它正在等待api发回结果,然后在屏幕上显示消息 我要找的是,这个页面启动了一个线程,我可以在上面做其他的事情。完成后,将显示结果 下面是我的按钮单击,HTTP调用,它将启动异步req和API方法 我有 仿效 在StackOverflow和其他论坛上寻找解决方案。我相信我是用同样的方式做的,当然我不是。 在aspx页面上添加了Async=true 按钮点击 prot
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();
}
}
}
原料药
任何帮助都将不胜感激 WebForms应用程序中的异步不会使表单的行为像客户端应用程序一样,它位于事件循环中并等待事件发生。它仍然是一个服务器呈现的页面,响应由按钮单击或更改事件触发的单个事务性HTTP请求,并由WebForm提供一个服务器呈现的HTML响应。一旦呈现,页面就完成了。没有等待下一次单击的“事件循环” WebForms/ASP.NET应用程序中的异步只允许您从主线程卸载一些处理,但它不会更改页面上UI的行为。将异步视为一种方法,可以同时运行多个操作,或者在后台运行较长时间的IO操作时释放主处理线程,然后在呈现最终页面之前返回 但它对页面实际呈现到浏览器中的方式或行为没有任何影响-WebForms页面仍然是一个纯服务器呈现的页面,通过HTTP回发处理事件。就浏览器而言,这是一个事务性请求:您单击一个按钮,页面就会重新呈现,无论您是否在后端使用Async
解决问题的方法是使用客户端JS框架来管理应用程序的异步流,并对服务器进行异步HTTP调用。这将为您提供所需的行为,其中一个长请求可以“在后台”运行,同时让客户端应用程序继续执行其他操作。操作完成后,服务器最终会给您回电话,然后您可以使用响应数据显示结果或通知用户。我认为您需要这样做:
private void btnCopy_Click (object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(async () =>
{
await RunAsync (Guid.Parse (SourceBusinessID), Guid.Parse (DestinationBusinessID), false);
lblError.Dispatcher.Invoke(() => { if (lblError.Text == "") lblError.Text = "Copy Completed!"; });
});
}
我想你可能有点困惑。我推荐斯蒂芬·克利里(Stephen Cleary)的作品。谢谢@Damien_,这真的很有帮助。谢谢@Rick,我可能会转向js框架。虽然有一件有趣的事情,但如果我从await RunAsyncGuid.ParseSourceBusinessID中删除await,Guid.ParseDestinationBusinessID,false;在我的按钮点击事件中,然后该方法运行sync,我可以在api在后台工作时执行其他操作。但是当API完成任务时,它会以某种方式杀死主工作进程。然后,我必须重新构建解决方案以重新开始。我不明白我的主工作进程为什么会死掉?你不能删除异步操作上的等待。它仍将运行,但异步运行,而不是等待。您的请求将完成,当Aysnc操作完成它所做的任何事情时,它将发现页面不再存在,然后-BOOM。同样,您需要了解一下异步在服务器上是如何工作的——您混淆了客户端和服务器端的异步功能,在您弄清楚这一点之前,您将遇到问题。
private void btnCopy_Click (object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(async () =>
{
await RunAsync (Guid.Parse (SourceBusinessID), Guid.Parse (DestinationBusinessID), false);
lblError.Dispatcher.Invoke(() => { if (lblError.Text == "") lblError.Text = "Copy Completed!"; });
});
}