[英]Async callback thread lock in Silverlight WCF
我想出了一個關於如何假冒對同步調用的SL 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
包裝在新線程中,我仍然會得到相同的行為。
/ * edit:實際上,考慮到它,它會將回調在等待的ui線程上排隊。 這也是我們不必Dispatcher.Invoke
的原因。當我們得到結果時調用。 無論如何,我總是可以在專用線程中執行整個操作(需要等待),然后在那里等待,但這將需要大量的重構,避免嘗試這一點。 * /
有沒有辦法解決?
掛起的原因是EndExecute
方法封送至UI線程,但您使用Sleep
調用阻塞了UI線程。 不管使用哪種技術來阻塞線程都沒有關系,考慮到在UI線程中調用該方法,您所做的任何事情都會導致死鎖。
在SIlverlight環境中進行開發時,您需要能夠異步編程,而不是使用同步方法。 如果您使用的是C#5.0,則可以使用async / await功能,該功能可以讓您編寫看似同步的異步代碼,但是它將被編譯為利用回調/繼續的異步調用,如果有的話,您將需要執行此操作。尚未升級到該版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.