.net 异步&;等待确定按钮禁用事件何时完成

.net 异步&;等待确定按钮禁用事件何时完成,.net,webforms,async-await,c#-5.0,.net,Webforms,Async Await,C# 5.0,我正在尝试使用Async并等待仅在按钮禁用事件完成时启用任务 我尝试使用: protected async void btnStart_Click(object sender, EventArgs e) { tskDisabled = DisableButton(); int result = await tskDisabled; if (result == 1) FilesCount(); }

我正在尝试使用Async并等待仅在按钮禁用事件完成时启用任务

我尝试使用:

   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;
    }
protected async void btnStart\u单击(对象发送方,事件参数e)
{
tskDisabled=DisableButton();
int结果=等待tskDisabled;
如果(结果==1)
文件计数();
}
专用异步任务DisableButton()
{
btnStart.Enabled=false;
等待任务。延迟(1000);
返回1;
}
我只想在禁用按钮btnStart时启动fileCount()方法


目前,任务已启动,但按钮仍处于启用状态。

也许您正在寻找类似的功能

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;
}
专用异步任务fileCountAsync()
{
....
}
受保护的异步void btnStart\u单击(对象发送方,事件参数e)
{
btnStart.Enabled=false;
var fileCount=await filescontasync();
SetFileCountInUI(fileCount);
btnStart.Enabled=true;
}

您正在使用WebForms。网络表单不是“活的”。它未连接到浏览器显示的内容。给定请求中所有ASP.NET对象的目的只是生成一次HTML。之后他们就死了

您在那里所做的一切都发生在HTML发送到浏览器之前。这是行不通的


您需要一个用于交互和逻辑控制内容的客户端解决方案。也许可以使用jQuery来操作按钮。
UpdatePanel
也值得研究。

客户端上的javascript如何?将js函数添加到脚本标记内的标记:

function disableMe(id) {
    if (id != undefined)
        if (document.getElementById(id.id) != null)
            document.getElementById(id.id).setAttribute("disabled", "disabled");
}
下一步添加OnClientClick到btnStart(注意返回true):


btnStart.Enabled=false;只有在客户端收到响应后,才会在UI上生效。正如usr和jeffreymergler所说,它需要一个客户端解决方案


但除此之外,它还需要一个响应/错误处理逻辑。这意味着javascript代码会禁用该按钮,但一旦收到响应,就需要重新启用该按钮。也就是说,客户端逻辑使用ajax调用服务器,并在回调过程中适当处理响应或错误。更新面板是提供ajax支持并具有事件处理功能的控件之一。如果更新面板不够,则使用自定义逻辑。

通常禁用按钮的可能重复操作是一种廉价操作,
filescout
可能是一种等待操作。如果一个按钮没有立即被禁用,这意味着一个UI线程正在忙着做一些应该在另一个线程上做的事情。你所说的
按钮禁用
事件是什么意思?我认为你错了。为什么尝试异步禁用该按钮?长时间运行的东西?你在使用WinForms吗<代码>btnStart.Enabled=false应同步完成。除非你不在UI线程上,在这种情况下。。。别说了,我在用ASP。NET网页表单。对不起,我以前应该提到过。我也尝试过这种方法,但按钮仍然处于启用状态,并跳转到FileCount方法。你是什么意思?在
btnStart.Enabled=false之后
btnStart.Enabled仍保持
true
?即使在btnStart.Enabled=false之后,用户界面仍处于忙碌状态,且不会禁用按钮。该控件立即移动到下一条语句fileCount()。正如您在上面看到的,
fileCountAsync
是可以等待的。所以用户界面不能被
filecountasync
占用。是的,我看到了。我试过了,但按钮仍处于启用状态。单击开始按钮后,UI将被阻止。试试看。
<asp:Button runat="server" ID="btnStart" OnClientClick="return disableMe(this);return true;" />