2015-10-05 76 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) –