我在多个列表上使用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);
}
}
在不查看代码的情况下,我能想到的最可能的原因是您有一个同步问题,也就是说,您的两个或多个请求几乎在同一时间接收结果,并试图修改跟踪响应请求数量的变量。您可能需要使用"锁"或类似的结构来确保代码块不会被两个线程同时访问。