我已成功地擊敗(:P)在Silverlight異步怪物一樣所以:
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..
});
基本的ideea是派生一個服務器線程(最後一個塊),它將引用等待對象。請勿將WaitAll調用放入調用方法/線程中,因爲這會導致本網站或其他站點中前面提到的其他問題的死鎖。
發生死鎖是因爲線程直到方法結束並且方法沒有結束纔會啓動,因爲WaitAll調用等待子線程結束。
不是在我上面的情況,但因爲WaitAll是在另一個線程上。
PS:而不是//做你的事情行代碼使用r1和r2捕獲的引用將保存數據或null如果結果失敗。
好問題,Silverlight中的一個常見問題 – 2009-10-08 08:28:46