【问题标题】:Async & Await to determine when button disable event completedAsync & Await 确定按钮禁用事件何时完成
【发布时间】:2015-01-21 02:11:37
【问题描述】:

我正在尝试仅在按钮禁用事件完成时使用 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() 方法。

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

【问题讨论】:

  • 通常禁用按钮是一个廉价的操作,FilesCount 可能是一个等待操作。如果一个按钮没有立即被禁用,这意味着一个 UI 线程正忙于做一些应该在另一个线程上完成的事情。
  • button disabled 事件是什么意思?我认为你走错路了。为什么您尝试异步禁用按钮?长期运行的东西?
  • 您在使用 WinForms 吗? btnStart.Enabled = false; 应该同步完成。 referencesource.microsoft.com/#System.Windows.Forms/winforms/… 除非您不在 UI 线程上,在这种情况下...停止。
  • 我正在使用 ASP。 NET Web 窗体。对不起,我应该在之前提到过。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    客户端上的一些 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】:

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

      您所做的所有事情都发生在 HTML 甚至发送到浏览器之前。这永远行不通。

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

      【讨论】:

        【解决方案4】:

        也许您正在寻找类似的东西?

        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;
        }
        

        【讨论】:

        • 我也尝试过这种方式,但是按钮仍然处于启用状态,它会跳转到 FileCount 方法。
        • 你是什么意思?在btnStart.Enabled = false; 之后btnStart.Enabled 仍然保留true?
        • 即使在 btnStart.Enabled = false 之后,UI 仍然很忙并且不会禁用按钮。控件立即移至下一条语句 FilesCount()。
        • 正如您在上面看到的,FilesCountAsync 是等待的。所以 UI 不能被 FilesCountAsync 忙碌。
        • 是的,我见过。我试过了,但按钮仍然启用。一旦单击“开始”按钮,UI 就会被阻止。试试看。
        猜你喜欢
        • 1970-01-01
        • 2022-10-23
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2018-09-23
        相关资源
        最近更新 更多