Краткий ответ: Вы можете сделать это, если вы не в ветке Dispatcher, что-то вроде:
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 / Командных шаблонов, где обрабатываются ваши ViewModels и Commands переключение между нитью диспетчера и нитями модели. Это большая работа, и есть некоторые ошибки, но когда это работает, это работает чудесно.
Если вы хотите использовать готовую платформу, которая работает аналогично, она доступна здесь: CodeProject: Представление шаблона потока представления потока модели . Архитектура также очень хорошо объяснена на этой странице.