我有两种方法,加载和卸载,如下所示:
protected Task load()
{
return Task.Run(() =>
{
controls.AsParallel().Where(control => control is Button).Cast<Button>().ForAll(control =>
{
control.Enabled = false;
});
});
}
protected Task unload()
{
return Task.Run(() =>
{
controls.AsParallel().Where(control => control is Button).Cast<Button>().ForAll(control =>
{
control.Enabled = true;
});
});
}
实际上,它们会阻止我的网站用户发送多个请求。我要做的基本上是:锁定所有按钮控件,运行与他们单击的按钮对应的功能,然后解锁所有按钮控件。即:
protected async void doStuff(object sender, EventArgs e)
{
await load();
await dostuffAsync();
await unload();
}
我没有收到任何错误,但它只是在页面更新之前完成所有操作,因此永远不会禁用控件。这可以在asp.net上做吗?我也尝试过scriptmanager无济于事:它只是同时执行所有任务然后更新页面。
答案 0 :(得分:1)
这里有很多事情发生,所以我会尝试分解它。
首先,这不应该起作用。如果您确实设法让它工作,那么您可以很好地将代码发现到未定义的行为领域,从可维护性的角度来看,这是您想要的最后一个地方。
其次,Web应用程序中的异步行为可能会导致各种不需要的行为,因此不应轻易使用。禁用按钮不是将这种复杂程度添加到应用程序的好理由。
第三,如果你想阻止用户在处理过程中提交表单,你应该总是使用某种客户端行为。 jQuery可以使这些操作相当简单。
第四,如果您需要阻止用户在服务器上执行多项操作作为安全性或完整性措施,则应限制对资源的访问,而不是触发操作的方法。
第五,如果可能的话,你应该停止ASP.Net Forms中的积极开发。这并不意味着您必须重写整个现有应用程序,因为可以并行运行ASP.Net Forms和MVC。见这里:http://www.hanselman.com/blog/IntegratingASPNETMVC3IntoExistingUpgradedASPNET4WebFormsApplications.aspx 链接说ASP.Net MVC 3,但我相信这仍然适用于最新的MVC版本。
答案 1 :(得分:1)
使用async
和await
无法完成您要做的工作。 async
控制线程池,而不是客户端。
您最好的方法是让JavaScript在请求进行过程中禁用按钮,并在完成时重新启用它们。
P.S。避免在ASP.NET上使用Task.Run
和AsParallel
;它们会破坏可扩展性。