2010-06-18 4 views
1

Я пытаюсь выполнить синхронизацию вызовов. Но приложение silverlight блокируется при вызове метода endList. В простом консольном приложении я могу синхронизировать async. Не удалось увидеть проблему.Синхронные вызовы Silverlight на wcf

var svc = new WcfServiceClient(); 
    var ar = svc.BeginList(null, null); 
    var result = svc.EndList(ar); <-- Silverlight hangs here 
    listBox.ItemsSource = result; 

ответ

2

Silverlight не поддерживает синхронные вызовы.

Here - статья об синхронных вызовах веб-сервисов и обходной путь.

0

Короткий ответ: Вы можете сделать это, если вы не на Диспетчерский нити, что-то вроде:

System.Threading.ThreadPool.QueueUserWorkItem(state => 
    { 
     IAsyncResult asyncResult = svc.BeginSomething(null, null); 

     if (!asyncResult.CompletedSynchronously) 
     { 
      asyncResult.AsyncWaitHandle.WaitOne(); 
     } 

     try 
     { 
      svc.EndSomething(asyncResult); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      asyncResult.AsyncWaitHandle.Close(); 
     } 
    }); 

Большим преимуществом является то, что вы можете сохранить слой модели домена синхронно, как в старые времена , вы можете реализовать отложенную загрузку легко и т.д ...

Но на практике вы можете использовать его только при разработке приложения строго придерживаться MVVM/командных узоров, где вы r ViewModels and Commands обрабатывают переключение между потоком диспетчера и потоками модели. Это много работы на земле, и есть некоторые проблемы, но когда это работает, это работает чудесно.

Если вы хотите использовать готовый к использованию фреймворк, который работает аналогично, он доступен здесь: CodeProject: Introducing the Model Thread View Thread Pattern. Архитектура также очень хорошо объясняется на этой странице.