await Task.Delay (0) Работает нормально, но не ожидает Task.Delay (1000) - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь реализовать asyn c с помощью Visual Studio 2017. Будучи новичком в asyn c, вот моя первая попытка, которую я не могу заставить работать, а также не могу найти ответ где-нибудь в inte rnet .

await Task.Delay(any non-zero number) кажется бесконечно l oop.
await Task.Delay(0) выполняется правильно.

Чего мне не хватает?

using System;
using System.Threading.Tasks;
using System.Web.UI;

namespace TestAsync
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterAsyncTask(new PageAsyncTask(GetContentAsync)); //It doesn't seem to matter whether I have this statement or not.
            var contentTask = GetContentAsync();
            Label1.Text = "This is now";
            Label2.Text = contentTask.Result.ToString();
        }

        public async Task<string> GetContentAsync()
        {
            await Task.Delay(0);  //Any non-zero number appears to cause an infinite loop.
            return "That's all folks";
        }
    }
}

1 Ответ

2 голосов
/ 24 января 2020

Вы испытываете тупик из-за блокировки по асинхронному c коду при вызове свойства Result Задачи.

В этом случае можно загрузить страницу одним из способов. как async void метод, затем с помощью await в вашем методе. Однако использование asyn c void имеет некоторые неприятные последствия.

protected async void Page_Load(object sender, EventArgs e)
{
    Label1.Text = "This is now";
    Label2.Text = await GetContentAsync();
}

Теперь вы можете использовать ненулевое значение в вашем Task.Delay без возникновения тупика.

Использование async void обычно не рекомендуется. Вместо этого вам следует зарегистрировать задачу в методе загрузки страницы, а затем обработать настройку вашей метки в этом. Нечто подобное может помочь:

protected void Page_Load(object sender, EventArgs e)
{
    RegisterAsyncTask(new PageAsyncTask(SetContentAsync));
    Label1.Text = "This is now";
}

private async Task SetContentAsync() 
{
    Label2.Text = await GetContentAsync();
}

У Microsoft есть дополнительная статья об использовании async / await в веб-формах, которую я бы рекомендовал прочитать. Вы можете найти это здесь .

...