我正在尝试使用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";
}
}
}
答案 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。