等待Task.Delay(0)运行正常,但等待Task.Delay(1000)不运行

时间:2020-01-24 15:55:05

标签: c# asynchronous async-await

我正在尝试使用Visual Studio 2017实现异步。这是我的第一次尝试,这是异步的新手,我无法开始工作,也无法在Internet上的任何地方找到答案。

await Task.Delay(any non-zero number)似乎处于无限循环中。
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 个答案:

答案 0 :(得分:2)

您正在遇到deadlock,原因是调用了Task的Result属性而阻止了异步代码。

在这种情况下,实现页面加载的一种方法是使用async void方法,然后在您的方法上使用await。但是,使用异步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还有一篇有关在Webforms中使用async / await的文章,我建议阅读。您可以找到它here