我正在尝试使用Async和Await来仅在按钮禁用事件完成时启用任务。
我尝试使用:
protected async void btnStart_Click(object sender, EventArgs e)
{
tskDisabled = DisableButton();
int result = await tskDisabled;
if (result == 1)
FilesCount();
}
private async Task<int> DisableButton()
{
btnStart.Enabled = false;
await Task.Delay(1000);
return 1;
}
我只想在禁用按钮btnStart时启动FilesCount()方法。
目前,任务已启动但按钮仍处于启用状态。
答案 0 :(得分:3)
您正在使用WebForms。 WebForm不是&#34; live&#34;。它与浏览器显示的内容无关。给定请求中所有ASP.NET对象的目的只是生成一次HTML。之后他们就死了。
您所做的所有事情都发生在将HTML发送到浏览器之前。这将永远不会奏效。
您需要一个客户端解决方案来实现交互性和逻辑控制内容。也许你可以使用jQuery来操作按钮。 UpdatePanel
也值得研究。
答案 1 :(得分:0)
也许你正在寻找这样的东西?
private async Task<int> FilesCountAsync()
{
....
}
protected async void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false;
var fileCount = await FilesCountAsync();
SetFileCountInUI(fileCount);
btnStart.Enabled = true;
}
答案 2 :(得分:0)
客户端上的一些javascript怎么样?将js函数添加到脚本标记内的标记中:
function disableMe(id) {
if (id != undefined)
if (document.getElementById(id.id) != null)
document.getElementById(id.id).setAttribute("disabled", "disabled");
}
接下来将OnClientClick添加到btnStart(注意返回true):
<asp:Button runat="server" ID="btnStart" OnClientClick="return disableMe(this);return true;" />
答案 3 :(得分:0)
btnStart.Enabled = false;只有在收到客户的响应后才会在UI上生效。因此,usr和jeffreymergler表示需要客户端解决方案。
但补充说它还需要一个响应/错误处理逻辑。这意味着javascript代码会禁用该按钮,但一旦收到响应,就需要重新启用它。这就是说客户端逻辑带有ajax来调用服务器,执行进程并在回调句柄中处理相应的响应或错误。 Update Panel是提供ajax支持并具有处理事件的控件之一。如果更新面板不够,那么请使用自定义逻辑。