我想出了關於如何僞造同步調用的SL WCF支持的想法。Silverlight中的異步回調線程鎖WCF
基本上,
private _completed;
private IList<Customer> _customers;
public void IList<Customer> GetAllCustomers()
{
bool completed = false;
DataServiceQuery<Customer> myQuery = this.Context.Customers;
myQuery.BeginExecute(OnQueryExecuted, myQuery);
while (!_completed)
System.Threading.Thread.Sleep(67); //tried join also
return _customers;
}
private void OnQueryExecuted(IAsyncResult result)
{
var query = result.AsyncState as DataServiceQuery<Customer>;
_customers = query.EndExecute(result).ToList();
_isCompleted = true;
}
什麼情況是,這個循環永遠。
我在while循環中放置了一個斷點,將它移出並恢復執行,並在接下來的毫秒中得出結果。
於是,我想到了回調查詢接收結果被排隊到相同的線程查詢在調用。
SL似乎很有決心保持這種行爲,所以即使我換了myQuery.BeginExecute
在一個新的線程中,我仍然會得到相同的行爲。
/*編輯:實際上,考慮一下,它會在等待的ui線程上排隊回調。這也是我們得到結果時不需要Dispatcher.Invoke
的原因。無論如何,我總是可以在專用線程中完成整個操作(需要等待),然後在那裏等待,但是這需要一堆重構,避免嘗試這一點。 */
有沒有辦法解決這個問題?
你正在以某種方式阻止UI線程,而不是循環爲什麼不只是調用'Execute'?這個方法'GetAllCustomers'永遠不會以你現在擁有的形式進行異步操作,所以只需調用'Execute'。我不明白爲什麼你試圖參與第二個線程而不是阻塞一個線程 - 這沒有任何好處,並且會降低應用程序的性能。你能再詳細一點嗎? – user1416420 2013-02-10 02:09:11
重點是它不是異步的。由於'myQuery.BeginExecute',db調用是異步的。無論如何,如果我調用'Execute',Silverlight突然通知我它不支持同步查詢。 – 2013-02-10 02:11:56
哦,我明白了,我不知道,讓我看看.. – user1416420 2013-02-10 02:12:56