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

时间:2014-11-23 07:34:18

标签: .net webforms async-await c#-5.0

我正在尝试使用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()方法。

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

4 个答案:

答案 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支持并具有处理事件的控件之一。如果更新面板不够,那么请使用自定义逻辑。