Асинхронный метод для обновления пользовательского интерфейса выполняется частично - PullRequest
0 голосов
/ 10 ноября 2019

Я разрабатываю приложение для Android с использованием xamarin, и то, что я пытаюсь сделать, действительно просто: одним нажатием кнопки отключить себя на 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;
        }
}

Проблема здесь в том, что при отладке приложения код выполняется только там, где стрелка указывает на все после того, как игнорируется. В приложении кнопка действительно отключается, поэтому я не совсем уверен, что происходит не так.

Спасибо!

1 Ответ

2 голосов
/ 10 ноября 2019

Попробуйте:

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

Вам не нужно Task.Run, если единственная асинхронная работа, которую вы имеете, - это ждать Task.Delay. Но если у вас есть больше асинхронной работы, то лучше использовать 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;
};
...