2012-07-18 54 views
0

我正在使用異步並在控制器中等待。等待沒有完成擴展方法,但在控制器中工作

下面的代碼工作正常

[HttpPost] 
[ValidateAntiForgeryToken]   
public async Task<ActionResult> Create(CompetitionViewModel viewModel) 
{ 
     if (ModelState.IsValid) 
     { 

      User user = null; 
      using (var facebookClient = new FacebookClient(viewModel.AccessToken)) 
      { 
       var facebookUser = await facebookClient.Me(); 
       user = entityStorage.GetUser(facebookUser); 
       FormsAuthentication.SetAuthCookie(user.FacebookId, true); 
      } 

但是,如果我嘗試和擴展方法執行相同的代碼,那麼等待永遠不會完成。

[HttpPost] 
[ValidateAntiForgeryToken]   
public ActionResult Create(CompetitionViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = entityStorage.GetCurrentUser(viewModel.AccessToken).Result; 

public static class Helpers 
    { 
     public async static Task<User> GetCurrentUser(this IEntityStorage entityStorage, string accessToken) 
     { 
      User user = null; 
      using (var facebookClient = new FacebookClient(accessToken)) 
      { 
       var facebookUser = await facebookClient.Me(); //STUCK HERE!! 
       user = entityStorage.GetUser(facebookUser); 
       FormsAuthentication.SetAuthCookie(user.FacebookId, true); 
      } 
      return user; 
     } 

我使用MVC4並在我的web.config <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />組按照其他線程建議。

任何人都可以告訴我爲什麼這是,我怎麼能得到它的工作?

回答

1

我有一個blog post that covers this in detail

總之,通過調用Result引起死鎖。相反,使您的Create方法async和使用await獲取用戶。:

[HttpPost] 
[ValidateAntiForgeryToken]   
public async Task<ActionResult> Create(CompetitionViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
    var user = await entityStorage.GetCurrentUser(viewModel.AccessToken);