我正在VS 2013上的新C#4.5 Web应用程序中尝试异步/等待代码。这是在IISExpress下在我的开发人员计算机上运行的Web应用程序。我在async方法中设置了一个断点,可以看到该方法已按预期完成。但是,等待调用之后的下一行代码似乎没有被命中。我在那里有一个断点,它没有命中,并且我尝试逐步执行代码。它似乎挂在那儿无限地等待着。我尝试在控制台应用程序中运行相同的代码,并且可以正常工作。这使我想知道异步/等待调试在Web应用程序中是否不起作用,或者它是否与IISExpress有关?还是我还缺少其他东西?
该代码非常基本,看起来像这样:
public async Task SomeMethodAsync(string parameter1)
{
}
...调用上述异步方法的代码:
await SomeMethodAsync("some value");
我知道了 导致这种情况的是代码的结构(我的问题中未包括)。它是Web Forms应用程序的事实似乎也是一个因素。原始代码如下所示:
protected void Button1_Click(object sender, EventArgs e)
{
var task = RunSample();
task.Wait();
}
private static async Task RunSample()
{
await SomeMethodAsync("some value");
}
事实证明,当异步方法运行时,代码的执行将task.Wait()
在按钮单击处理程序中执行,然后在那里等待。我不会期望代码会在那里(这是我从控制台应用程序复制的代码...)
我决定将RunSample()代码移到按钮单击处理程序中,就像这样,消除了RunSample():
protected async void Button1_Click(object sender, EventArgs e)
{
await SomeMethodAsync("some value");
}
这导致最初来自编译器的错误,需要将Async =“ true”添加到@Page指令。之后,它按预期开始工作。即使使用我的原始代码,并在其中使用Async =“ true”,该方法也不起作用。我相信关键是要为单击按钮处理程序标记上async
关键字。
感谢@NielsFilter和@DaniCE的后续问题,让我进一步研究了这一问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句