2012-05-09 58 views
1

我正在使用4.5 Beta的Visual Studio 2011 Beta。似乎有一个ASP.Net MVC 4的错误,如果该方法返回一个没有“TaskAsync”任务,它挂起请求。asp.net mvc 4异步控制器挂在none TaskAsync方法

public class HomeController : Controller 
{ 
    // 
    // GET: /Home/ 

    public async Task<ActionResult> Test1() 
    { 
     string s = await new WebClient().DownloadStringTaskAsync("http://google.com"); 
     return Content("asdf"); 
    } 

    public async Task<ActionResult> Test2() 
    { 
     string MyConString = ConfigurationManager.ConnectionStrings["Master"].ConnectionString; 
     MySqlConnection connection = new MySqlConnection(MyConString); 
     await connection.OpenAsync(); 
     connection.Close(); 
     return Content("asdf"); 
    } 
} 

Test1正常工作。 方法返回后,Test2挂起。我可以通过代码进行调试而不会出错。

任何人都知道此修复/解决方法?

+0

这可能是相关的:http://stackoverflow.com/questions/9977309/async-ctp-mvc4-and-workflows –

+0

当你说它调试没有错误, Test2的Content()行上的断点受到影响吗?如果是这样,那么像相关的SO线程一样添加Yield是否可以提供帮助? –

+0

是的Content()行命中并且该方法实际完成。它在方法返回到MVC引擎后卡住了。 – user896993

回答

4

Known issue with MVC 4 Beta.

总之,添加以下到〜/ Web.config中:

<appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 

然后加入await Task.Yield();如在动作方法的第一行。 (别忘了等待!)

+0

工作正常!感谢您的答复:) :) – user896993

+0

当异步&等待在内部使用,但不是所有的方式直到控制器的行动方法吗? (即从action方法调用的代码等待异步方法的Task.Result)如果它应该在那种情况下工作,那么我做错了什么,它会在那个点附近冷却。 ISS徘徊,浏览器停留在“等待www.testwebsite.local”,直到关闭它为止,这是一个耗时且难以调试的错误模式。 – Anthony

相关问题