【问题标题】:Async method to update ui executes partially更新 ui 的异步方法部分执行
【发布时间】:2019-11-10 13:40:31
【问题描述】:

我正在使用 xamarin 开发一个 android 应用程序,我想要做的事情非常简单:单击一个按钮将自身禁用 1 秒钟。

这是我整理的代码的相关部分:

protected override void OnCreate(Bundle savedInstanceState)
{
//...
        sendShortDataButton.Click += (object sender, EventArgs e) => {
                Task.Run(() => DisableButtonFor());               
            };
//...
        private async Task DisableButtonFor()
        {
            sendShortDataButton.Enabled = false; //<------
            await Task.Delay(1000);
            sendShortDataButton.Enabled = true;
        }
}

这里的问题是,通过调试应用程序,代码只运行到箭头指向的位置,然后忽略所有内容。在应用程序上,按钮确实被禁用了,所以我不太确定出了什么问题。

谢谢!

【问题讨论】:

    标签: c# android xamarin.android async-await task


    【解决方案1】:

    试试这个:

    sendShortDataButton.Click += async (sender, e) =>
    {
        var button = (Button)sender;
        button.Enabled = false;
        await Task.Delay(1000);
        button.Enabled = true;
    };
    

    如果您唯一的异步工作是等待Task.Delay,则不需要Task.Run。但是,如果您确实有更多异步工作要做,那么最好只使用Task.Run 来完成这项工作:

    sendShortDataButton.Click += async (sender, e) =>
    {
        var button = (Button)sender;
        button.Enabled = false;
        await Task.Run(async () =>
        {
            await Task.Delay(1000); // Simulate async work
        });
        button.Enabled = true;
    };
    

    【讨论】:

    • 谢谢您,这个解决方案非常有效!试图理解我做错了什么,会不会是这样的事情?:没有必要在后台线程上运行异步方法,这会阻止再次设置按钮状态。
    • 我对 Xamarin 了解不多,但一般来说,当从 UI 线程以外的任何线程访问 UI 应用程序的控件时,都会发生不好的事情。关于调试过程中 Visual Studio 的行为我也知之甚少,因为我个人更喜欢使用 Ctrl+F5(不调试)来测试我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多