2015-05-29 60 views
1

我正在尝试在VS 2013上的新C#4.5 Web应用程序中使用异步/等待代码。它是在IISExpress下我的开发人员计算机上运行的Web应用程序。我在异步方法中设置断点,并可以看到该方法按预期完成。但是,等待电话后的下一行代码看起来并没有被击中。我在那里有一个断点,它没有被打到,我尝试了一下代码。它似乎在那里等待无限。我试着在控制台应用程序中运行相同的代码,并且工作正常。 这使我想知道异步/等待调试在Web应用程序中无法工作,或者它可能与IISExpress有关?还是有什么我失踪?调用C#异步方法不会在Web应用程序中返回

的代码是非常基本的,看起来像这样:

public async Task SomeMethodAsync(string parameter1) 
{ 

} 

...代码调用上述异步方法:

await SomeMethodAsync("some value"); 
+1

你在使用什么Web框架? 如果您使用的是Asp.Net MVC,则必须在控制器中使用异步操作: http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4 – DaniCE

+1

代码跑过了等待?把一些日志记录在那里,看看它是否是一个“调试”问题,或者你的异步方法可能永远不会完成。 –

+0

@DaniCE,谢谢,它是一个经典的Web窗体。 –

回答

0

我得到它的工作。这是导致这种情况的代码结构(不包括在我的问题中)。它是一个Web窗体应用程序的事实似乎也是一个因素。原来的代码是这样的:

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"); 
} 

这导致了一个错误最初从该异步=“真”需要被添加到@Page指令的编译器。这样做后,它开始按预期工作。即使使用我的原始代码,并且Async =“true”,那也不起作用。我相信的关键是按钮点击处理程序标有async关键字。

感谢@NielsFilter和@DaniCE来跟进问题,让我进一步了解这一点。

+1

太好了。重要的是要记住的是尽量不要混合TPL方法,如.Wait和.Result与异步和等待。由于实际上等待“捕获上下文”并且.Wait和.Result被阻塞,等待等待返回结果,那么最终可能导致死锁。有关更多详细信息,请参阅我的博客中的异步陷阱编号2:https://filteredcode.wordpress.com/2015/05/27/async-pitfalls-part-4-of-4/ –

+1

我有[博客文章](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html),详细描述这个问题。您也可以找到我的[关于异步最佳实践的MSDN文章](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)和[关于异步ASP.NET的MSDN文章](https:// msdn .microsoft.com/en-us/magazine/dn802603.aspx)很有帮助。 –