簡體   English   中英

Silverlight WCF中的異步回調線程鎖定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM