1

ODataサービスに接続するSilverlight4アプリケーションがあります。私のモデルは複数のクエリをサービスに並行して送信しており、クエリコールバックでは、バックグラウンドワーカーを使用して結果を処理しています。

これは、1つの呼び出しを行う場合はうまく機能しますが、複数の呼び出しを並行して行うとすぐに(場合によっては機能します)、EndExecuteを呼び出すと、ほとんどの場合、データサービスコンテキストで例外が発生します(内部の変更追跡メカニズムにエンティティを追加しています。)

そこで、EndExecuteを呼び出した時点でデータサービスをロックすることにしました。

lock (dataService)
{
    results = query.EndExecute(queryCallback).ToList<Video>(); 
}

これで問題が修正され、データリクエストが確実に処理されるようになりました。

私の質問は2つあります-これは推奨される方法ですか?ODataコンテキストはスレッドセーフではありませんか?

4

1 に答える 1

2

DataServiceContextはスレッドセーフではありません。スレッドアフィニティはありませんが、複数のスレッドを同時に呼び出すことはサポートされていません。

したがって、ロックまたはその他の手段を使用して、一度に1つのスレッドのみがコンテキストおよび関連するオブジェクト(クエリオブジェクトなど)に入るようにする必要があります。

于 2010-09-10T23:01:13.817 に答える