Как вы ждете / присоединяетесь к веб-службе WCF, вызываемой из Silverlight? - PullRequest
0 голосов
/ 24 ноября 2008

Если вы вызываете веб-сервис из Silverlight, как это:

MyServiceClient serviceClient = new MyServiceClient();
void MyMethod()
{
  serviceClient.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(serviceClient_GetDataCompleted);
  serviceClient.GetDataAsync();

  // HOW DO I WAIT/JOIN HERE ON THE ASYNC CALL, RATHER THAN BEING FORCE TO LEAVE THIS METHOD?

}

Я предпочел бы подождать / присоединиться к потоку службы asych внутри «MyMethod», а не выходить из «MyMethod» после вызова «GetDataAsync», каков наилучший способ сделать это?

Спасибо, Джефф

Ответы [ 5 ]

4 голосов
/ 09 февраля 2010

Нет, вы не можете сделать это так. Вы окажетесь в тупике. GetDataCompleted вызывается mainthreed. То же самое, что ждет в WaitOne.

1 голос
/ 10 февраля 2010

Я должен спросить; Зачем? Суть в том, чтобы предоставить вашему пользователю плавный опыт, и ожидание вызова веб-службы не обязательно сделает это. Я полагаю, вы хотите, чтобы полный блок контента загружался до загрузки элемента управления Silverlight. В этом случае я бы предпочел кэшировать содержимое, а не заставлять клиента ждать бесконечно.

0 голосов
/ 10 февраля 2010

Если у вас был базовый класс, обеспечивающий механизм построения канала WCF, он мог бы затем использоваться для построения методов BeginX / EndX для асинхронного вызова.

public class ServiceFooCoordinator : CoordinatorBase<IServiceFoo>
{
    public IAsyncResult BeginMethodFoo ()
    {
        IAsyncResult ar = null;
        IServiceFoo channel = null;
        channel = _factory.GetChannel();

        Begin( channel, () => ar = channel.BeginMethodFoo( null, channel ) );
        return ar;
    }

    public Bar[] EndMethodFoo ( IAsyncResult ar )
    {
        IServiceFoo channel = null;
        channel = _factory.GetChannel();
        return channel.EndMethodFoo( ar );
    }
}

Который затем можно использовать в методе:

 ServiceFooCoordinator _coordinator;

 var asyncResult = _coordinator.BeginMethodFoo();
 try
 {
   var result = _coordinator.EndMethodFoo( asyncResult );
 }
 catch ( Exception )
 { }

Что дает вам ваш асинхронный вызов синхронно.

0 голосов
/ 01 декабря 2008

Вы также можете использовать лямбду и замыкание, чтобы получить похожее поведение:

serviceClient.GetDataCompleted += (s,e) =>
{
  // Your code here
};
serviceClient.GetDataAsync();
0 голосов
/ 24 ноября 2008

Чтобы сделать это, вы должны использовать ManualResetEvent в своем классе (переменная уровня класса) и затем ждать его.

void MyMethod()
{
  wait = new ManualResetEvent(false);
  // call your service
  wait.WaitOne();
  // finish working
}

и в коде вашего обработчика события

void serviceClient_GetDataCompleted(...)
{
  // Set values you need from service
  wait.Set();
}
...