Асинхронный вызов веб-службы из Silverlight 3 - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть вопрос относительно последовательности событий в сценарии, когда вы вызываете службу wcf из silverlight 3 и обновляете пользовательский интерфейс в отдельном потоке. В принципе, я хотел бы знать, правильно ли то, что я делаю ... Пример следующий. Это мой первый пост здесь, так что терпите меня, потому что я не уверен, как разместить реальный код. Пример выглядит следующим образом:

//<summary>
public static void Load(string userId)
{

  //Build the request.
  GetUserNameRequest request =
    new GetUserNameRequest { UserId = userId };

  //Open the connection.
  instance.serviceClient = ServiceController.UserService;

  //Make the request.
  instance.serviceClient.GetUserNameCompleted
    += UserService_GetUserNameCompleted;

  instance.serviceClient.GetGetUserNameAsync(request);

  return instance.VM;
}

/// <summary>
private static void UserService_GetUserNameCompleted(object sender, GetUserNameCompletedEventArgs e)
{
  try
  {
    Controller.UIDispatcher.BeginInvoke(() =>
    {
      //Load the response.
      if (e.Result != null && e.Result.Success)
      {
        LoadResponse(e.Result);
      }

      //Completed loading data.
    });
   } 
   finally
   {
     instance.serviceClient.GetUserNameCompleted 
       -= UserService_GetUserNameCompleted;

     ServiceHelper.CloseService(instance.serviceClient);
   }
}

Таким образом, мой вопрос в основном заключается в том, что внутри моего потока пользовательского интерфейса, когда я загружаю ответ, если он вызывает исключение, блок "finally" поймает это? Если нет, я должен поместить еще одну попытку / ловить внутри лямбды, куда я загружаю ответ?

Кроме того, поскольку я выполняю загрузку в потоке пользовательского интерфейса, возможно ли, что finally будет выполнено до того, как поток пользовательского интерфейса завершит обновление? И может ли в результате вызвать Servicehelper.CloseService () до того, как загрузка будет выполнена?

Я спрашиваю, потому что у меня периодически возникают проблемы с использованием этого подхода.

1 Ответ

0 голосов
/ 11 ноября 2009

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

Как правило, лучший подход к этому типу вещей состоит в том, чтобы извлечь все необходимые данные из ответа и сохранить их в переменной, а затем очистить код службы. Затем сделайте вызов BeginInvoke и обновите пользовательский интерфейс, используя данные в переменной.

...