2015-10-05 72 views
0

我一直在玩基於https://github.com/JeffGos/urbanairsharp創建REST包裝器。來自MVC控制器的調用方法因異步等待而掛起

public LoginResponse Login() 
    { 
     return SendRequest(new LoginRequest(new Model.Login())); 
    } 

private static TResponse SendRequest<TResponse>(BaseRequest<TResponse> request) where TResponse : BaseResponse, new() 
    { 
     try 
     { 
      var requestTask = request.ExecuteAsync(); 

      return requestTask.Result; 
     } 
     catch (Exception e) 
     { 
      //Log.Error(request.GetType().FullName, e); 

      return new TResponse() 
      { 
       Error = e.InnerException != null ? e.InnerException.Message : e.Message, 
       Ok = false 
      }; 
     } 
    } 

我能夠調用登錄方法從一個控制檯應用程序完全正常,但如果我把它從一個MVC控制器,它通過代碼精細步驟,但從來沒有經過線

var requestTask = request.ExecuteAsync(); 

我已經讀過這個主題,但不太明白我如何從一個Web應用程序使用這些方法? Login()方法不是異步的,所以我不明白爲什麼它會從我的MVC操作(也是非異步)失敗?

感謝

+0

我相信[this](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)可能會有你的答案。 – StriplingWarrior

回答

3

此:

var requestTask = request.ExecuteAsync(); 
return requestTask.Result; 

導致你的代碼死鎖。您正在通過與Task.Result的呼叫同步來阻止異步方法,這就是爲什麼要使用you shouldn't block on async code。相反,你需要異步等待await。這將有效地使您的通話鏈變得異步還有:

public Task<LoginResponse> LoginAsync() 
{ 
    return SendRequestAsync(new LoginRequest(new Model.Login())); 
} 

private static async Task<TResponse> SendRequestAsync<TResponse>(BaseRequest<TResponse> request) where TResponse : BaseResponse, new() 
{ 
    try 
    { 
     return await request.ExecuteAsync(); 
    } 
    catch (Exception e) 
    { 
     //Log.Error(request.GetType().FullName, e); 

     return new TResponse() 
     { 
      Error = e.InnerException != null ? e.InnerException.Message : e.Message, 
      Ok = false 
     }; 
    } 
} 

如果你不能改變你的調用鏈,成爲異步,使用同步API來代替。

+0

沒問題,我想我多瞭解一點。我確實閱讀過之前提到過的那篇文章,但我不太明白爲什麼這會阻止請求。按照我以前的方式做這件事的意義何在? – Raj

+0

另外,是否有可能從同步的傳統VB.NET WebForm中調用LoginAsync方法作爲NON異步調用?我試着創建一個我的類的實例,並在不等待的情況下調用它,並像以前一樣陷入僵局?我真的不想開始在傳統應用程序中隨處添加異步... – Raj

+0

@Raj不,我肯定會再次推薦它。異步和同步方法通常有不同的代碼執行路徑,需要「重複」。您不應該[*「通過異步同步」*](http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx)或[*「異步同步」* ](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx) –