当我试图从idx = pd.date_range(str(year), str(year + 1), freq='d', closed='left')
(MVC应用程序)调用GetAllFiles()
时,它会在结束大括号后卡住。我可以在调试模式下看到数据,但是当到达然后结束大括号时它会卡住。
当我从邮递员调用相同的WebApi方法时,我可以轻松获取数据。
HttpClient
这是HttpClient对api的调用
public class FileToDriveController : ApiController
{
public IHttpActionResult GetAllFiles()
{
//Gets credentials
GoogleUtility googleUtility = new GoogleUtility();
UserCredential credential = googleUtility.GetCredential();
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "DriveApiFileUpload"
});
var listRequest = service.Files.List();
listRequest.MaxResults = 10;
IList<Google.Apis.Drive.v2.Data.File> files = listRequest.Execute().Items;
if(files!=null)
{
return Ok(files); //i can see files here in debug mode
}
return InternalServerError();
}
}
答案 0 :(得分:1)
在控制器内进行异步调用时,问题是一个棘手的问题。请参阅此优秀说明:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
顶级方法调用GetJsonAsync(在UI / ASP.NET上下文中)。 GetJsonAsync通过调用HttpClient.GetStringAsync(仍在上下文中)启动REST请求。 GetStringAsync返回未完成的Task,表示REST请求未完成。 GetJsonAsync等待GetStringAsync返回的任务。捕获上下文,稍后将用于继续运行GetJsonAsync方法。 GetJsonAsync返回未完成的Task,表示GetJsonAsync方法未完成。 顶级方法同步阻止GetJsonAsync返回的任务。这会阻止上下文线程。 ...最终,REST请求将完成。这样就完成了GetStringAsync返回的任务。 GetJsonAsync的延续现在可以运行了,它等待上下文可用,以便它可以在上下文中执行。 僵局。顶级方法是阻塞上下文线程,等待GetJsonAsync完成,GetJsonAsync正在等待上下文空闲,以便它可以完成。
解决您的问题(再次,从博客文章中获取):
在“库”异步方法中,尽可能使用ConfigureAwait(false)。 不要阻止任务;一直使用async。