我必须从Angular多次调用Web API。问题是这导致线程中出现某种死锁,并且超时返回“任务被取消”。我尝试使用我在另一篇文章中找到的ConfigureAwait(false),但它没有解决我的问题。在我的角度控制器中,我有:
function getClusterLinks(linkCode, returnString) {
var deferred = $q.defer();
$scope.returnString = returnString;
contractorService.gethyperlink(linkCode)
.success(function (data) {
var vchUrl = data[0].vchUrl;
var end = vchUrl.length;
var docID = vchUrl.substring(vchUrl.indexOf("=") + 1, end);
var vchLinkName = data[0].vchLinkName;
var yay = '<a href="" ng-click="getDocumentByID(' + docID + ')">' + vchLinkName + '</a>';
var yCode = "|Y" + linkCode + "~";
$scope.returnString = $scope.returnString.replaceAll(yCode, yay);
deferred.resolve();
})
return deferred.promise;
}
在我的角色服务中:
this.gethyperlink = function (id) {
return $http.get('/Home/GetHyperLink?id=' + id)
};
在我的MVC控制器中:
public async Task<ActionResult> GetHyperLink(int id)
{
var link = await CommonClient.GetHyperLinkByID(id);
return Json(link, JsonRequestBehavior.AllowGet);
}
在我的CommonWebApiClient中:
public Task<List<HyperLinkModel>> GetHyperLinkByID(int linkID)
{
try
{
var response = PerformGet<List<HyperLinkModel>>(string.Format("api/GetMyHyperlinks/{0}", linkID.ToString()));
return response;
}
catch (Exception ex)
{
throw ex;
}
}
在我的WebApiClientBase中:
protected async Task<T> PerformGet<T>(string requestUri)
{
using (var client = new HttpClient { BaseAddress = _baseAddress })
{
try
{
AppendDefaultHeaders(client);
var response = await client.GetAsync(requestUri).ConfigureAwait(false);
var responseContent = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(responseContent);
}
catch (Exception e)
{
throw e;
}
}
}
它挂起的上面一行是:
var response = await client.GetAsync(requestUri).ConfigureAwait(false);
非常感谢任何帮助!
答案 0 :(得分:0)
我认为问题出在您的GetHyperLinkByID
方法中。建议通过管道进行异步处理。试试这个
public async Task<List<HyperLinkModel>> GetHyperLinkByID(int linkID)
{
try
{
var response = await PerformGet<List<HyperLinkModel>>(string.Format("api/GetMyHyperlinks/{0}", linkID.ToString()));
return response;
}
catch (Exception ex)
{
throw ex;
}
}
当我在方法结束时使用异步方法添加Async时,它会帮助我,所以我知道我的方法是异步的,我需要等待它。
希望有所帮助。