0

我正在使用ExecuteQueryAsync多个列表将数据填充到List<ListItemCollection>. 收到所有响应后,我将数据绑定到我的 Silverlight 应用程序。

ExecuteQueryAsync 理想情况下可以成功或失败。我基本上会跟踪收到的成功和失败响应总数,并且一旦收到的计数与总请求匹配。在收到所有响应并将数据绑定到应用程序之前,我会显示一个等待图标。现在的问题是,例如,我发出 12 个请求,但我只收到 10 或 11 个响应。我似乎不明白为什么我没有收到最后几个请求的响应。我既不走向成功也不走向失败。

有人面临这个问题吗?您能否帮助我了解导致此问题的原因以及为什么既没有收到成功也没有收到响应的原因。如果我执行相同的操作,它会起作用。这个问题时不时地发生,我不知道如何解决这个问题。

var requestCount = 0;
var responseCount = 0;
List<ListItemCollection>() bindingData;
public function getData(){
   showWaitIcon();
   //Some Code here to form the CAML query
   bindingData = new List<ListItemCollection>();
   for(int i=0; i<10; i++){
      //Some Code here to create the Client Context to query each Document Library or List
      clientContext.RequestTimeout = -1;
      clientContext.Load(clientContext.Web);
      ListItemCollection _lstItems;
      clientContext.Load(_lstItems);
      clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
      requestCount++;
   }
}

private void onQuerySucceeded(object sender, ClientRequestSucceededEventArgs args)
{
     responseCount++;
     this.Dispatcher.BeginInvoke(BindData);
}

private void onQueryFailed(object sender, ClientRequestFailedEventArgs args)
{
     responseCount++;
     this.Dispatcher.BeginInvoke(BindData);
}

private function BindData(){
    if(requestCount == responseCount() {
        hideWaitIcon();
        bindToSilverlightView(bindingData);
    }
}
4

1 回答 1

1

在不查看您的代码的情况下,我能想到的最可能的原因是您有一个同步问题,也就是说,您的两个或多个请求几乎同时收到结果并试图修改您所在的变量跟踪已答复请求的数量。您可能需要使用“锁”或类似结构来确保两个线程不会同时访问该代码块。

于 2013-03-14T11:59:44.973 回答