2016-09-21 39 views
0

我必须从Angular对Web API进行多次调用。问题是这导致线程中出现某种死锁,并且超时返回“任务被取消”。我尝试使用在另一篇文章中找到的ConfigureAwait(false),但它没有解决我的问题。在我的角度控制器,我有:从Angular导致Web API的多个异步调用导致程序挂起

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

你在哪里打电话给PerformGet? – MichaelDotKnox

+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; 
    } 
} 

它帮助我,当我做一个异步方法来添加异步的方式结束,所以我知道我的方法是异步的,我需要等待它。

希望有所帮助。

+0

感谢您的帮助。我仍然有同样的问题。 –