Как использовать async / await для задержки задачи без блокировки пользовательского интерфейса - PullRequest
0 голосов
/ 14 декабря 2018

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

Вот мой код вначале:

void dovoid1(){
//dosomething
}
void dovoid2(){
//dosomething
}
void dovoid3(){
//dosomething
}

и

void action()
{
            dovoid1();
            Thread.Sleep(1000);
            dovoid2();
            Thread.Sleep(1000);
            dovoid3();
            Thread.Sleep(1000);
            action();
}

Как видите, действие void ()будет делать некоторые задачи, и поспать между ними.После этого это повторится.Теперь я хочу избежать Thread.Sleep (), потому что он блокирует пользовательский интерфейс.Поэтому я пытаюсь использовать async / await.

private async void action()
        {

            dovoid1();
            Task.Delay(1000);
            dovoid2();
            Task.Delay(1000);
            dovoid3();
            Task.Delay(1000);
            action();
        }

Но это дает мне ошибки.Я не знаю, где и когда я должен использовать async или ждать.Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

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

Кроме того, если action() не является обработчиком события, то, вероятно, оно должно быть async Task вместо async void (см. , почему voidплохо асинхронно? ).

private async Task action()
{
    dovoid1();
    await Task.Delay(1000);
    dovoid2();
    await Task.Delay(1000);
    dovoid3();
    await Task.Delay(1000);
    action();
}
0 голосов
/ 14 декабря 2018

вы можете использовать этот подход в родительской функции для неблокирования вашего пользовательского интерфейса

await Task.Run(() => {
    // Do lot of work here
});

в вашем случае

await Task.Run(() => action());

, если ваш метод действия асинхронный

async Task action(){}

затем

await Task.Run(async () => await action());

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

async Task action()
{
            dovoid1();
            await Task.Delay(1000);
            dovoid2();
            await Task.Delay(1000);
            dovoid3();
            await Task.Delay(1000);
            action();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...