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 线程内部,当我加载响应时,如果抛出异常,“finally”块会捕捉到它吗?如果不是,我应该在加载响应的 lambda 中再放一个 try/catch 吗?

另外,由于我在 ui 线程上执行加载,最终是否有可能在 UI 线程完成更新之前执行?因此可以在加载完成之前调用 Servicehelper.CloseService() 吗?

我问是因为我在使用这种方法时遇到了间歇性问题。

4

1 回答 1

0

finally 块应该在 BeginInvoke 中的响应处理之前执行。BeginInvoke 意味着代码将在下一个 UI 周期中执行。

通常,处理此类事情的最佳方法是从响应中提取您需要的所有数据并将其存储在变量中,然后清理您的服务代码。然后调用 BeginInvoke 并使用变量中的数据更新 UI。

于 2009-11-11T16:24:28.440 回答