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

コードを調べずに考えられる最も可能性の高い原因は、同期の問題があることです。つまり、2 つ以上のリクエストがほぼ同時に結果を受け取り、変数を変更しようとしています。応答されたリクエストの数を追跡します。コードのブロックが 2 つのスレッドによって同時にアクセスされないようにするために、「ロック」または同様の構造を使用する必要がある場合があります。

于 2013-03-14T11:59:44.973 に答える