使用ExecuteQueryAsync时延迟接收响应或无响应

时间:2013-03-14 06:39:41

标签: silverlight sharepoint client-object-model sharepoint-clientobject

我在多个列表中使用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);
    }
}

1 个答案:

答案 0 :(得分:1)

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