Самый прямой ответ на ваш вопрос: Не блокируйте вызовы WCF. Они затрудняют причину. Там, вполне вероятно, нет способа заблокировать, если вы даже пытались ... но не надо.
Проработка: режим работы для Silverlight - асинхронность. Это то, к чему вы должны привыкнуть при разработке в Silverlight. Из-за этого вам очень трудно что-либо блокировать.
Это хорошая вещь, на мой взгляд. Когда вы блокируете результат чего-то вроде вызова службы WCF, вы в конечном итоге блокируете пользовательский поток. Это требует некоторого привыкания со стороны разработчика, но опять же ... привыкнуть к нему.
Допустим, у вас есть код, который вы хотите использовать следующим образом (синхронно):
var theResult = clientService.DoSomething(foo);
Process(theResult);
Способ переписать его будет следующим (асинхронный):
clientService.DoSomethingCompleted += (sender, args) => Process(args.Result);
clientService.DoSomethingAsync(foo);
Делая шаг вперед, я хотел бы абстрагировать свои сервисы как интерфейсы (чтобы я мог заменить их при тестировании или работать в автономном режиме при разработке). Я использую это как возможность создать интерфейс, который выглядит следующим образом:
public interface IMyService
{
void DoSomething(string input, Action<string> whenComplete);
}
Я внедряю сервис, подобный приведенному выше асинхронному коду, а затем, когда я его вызываю, он очень чистый и простой:
myService.DoSomething(foo, Process);
Вы обнаружите, что большая часть вашей системы превратится в асинхронную кодовую базу, но для этого может потребоваться изменить ваши ожидания.