0

Silverlight 3 から wcf サービスを呼び出し、別のスレッドで UI を更新するシナリオでのイベントの順序付けに関して質問があります。基本的に、自分のやっていることは正しいのか知りたいのですが... サンプルは以下の通りです。これは私の最初の投稿です。実際のコードを投稿する方法がわからないため、ご容赦ください。サンプルは次のとおりです。

//<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);
   }
}

したがって、私の質問は基本的に、応答をロードしているときにUIスレッド内で例外がスローされた場合、「最終的に」ブロックがそれをキャッチしますか? そうでない場合は、応答をロードしているラムダ内に別の try/catch を配置する必要がありますか?

また、UI スレッドでロードを実行しているため、UI スレッドの更新が完了する前に finally が実行される可能性はありますか? その結果、ロードが完了する前に Servicehelper.CloseService() を呼び出すことができますか?

このアプローチを使用すると断続的な問題が発生するため、質問します。

4

1 に答える 1

0

最終ブロックは、BeginInvoke 内の応答の処理の前に実行する必要があります。BeginInvoke は、コードが次の UI サイクルで実行されることを意味します。

通常、この種のことに対する最善のアプローチは、必要なすべてのデータを応答から取り出して変数に格納し、サービス コードをクリーンアップすることです。次に、BeginInvoke を呼び出し、変数のデータを使用して UI を更新します。

于 2009-11-11T16:24:28.440 に答える