私はなんとか(:P)銀色の光の中で非同期モンスターを次のように倒すことができました:
var ctx = new ModelEntities(new Uri("http://localhost:2115/Data.svc"));
ManualResetEvent m1 = new ManualResetEvent(false);
ManualResetEvent m2 = new ManualResetEvent(false);
var q1 = (DataServiceQuery<Department>)(from e in ctx.Department select e);
var q2 = (DataServiceQuery<Person>)(from e in ctx.Person select e);
Department[] r1 = null;
Person[] r2 = null;
q1.BeginExecute(r =>
{
try { r1 = q1.EndExecute(r).ToArray(); }
finally { m1.Set(); }
}, null);
q2.BeginExecute(r =>
{
try { r2 = q2.EndExecute(r).ToArray(); }
finally { m2.Set(); }
}, null);
ThreadPool.QueueUserWorkItem((o) =>
{
WaitHandle.WaitAll(new WaitHandle[] { m1, m2 });
// do your thing..
});
基本的な考え方は、待機オブジェクトへの参照を持つウェイタースレッド(最後のブロック)を生成することです。このサイトまたは他のサイトで前述したように、デッドロックが発生するため、WaitAll呼び出しを呼び出し元のメソッド/スレッドに入れないでください。
デッドロックが発生するのは、メソッドが終了するまでスレッドが開始されず、WaitAll呼び出しが子スレッドの終了を待機するためにメソッドが終了しないためです。
ただし、上記の私の場合は、WaitAllが別のスレッド上にあるためです。
PS://代わりに、データを保持するr1およびr2でキャプチャされた参照を使用するコードを配置し、その結果が失敗した場合はnullを配置します。