【问题标题】:Where best to instantiate and close a Silverlight-enabled WCF Service from the Silverlight app?从 Silverlight 应用程序实例化和关闭启用 Silverlight 的 WCF 服务的最佳位置在哪里?
【发布时间】:2008-11-10 20:07:35
【问题描述】:

当使用启用 Silverlight 的 WCF 服务时,实例化服务和调用 CloseAsync() 方法的最佳位置在哪里?

您应该说,每次需要调用服务时都实例化一个实例,还是将实例实例化为将要进行调用的 UserControl 的变量更好?

那么,在哪里调用 CloseAsync 方法更好呢?您是否应该在每个“someServiceCall_completed”事件方法中调用它?或者,如果创建为 UserControl 类的变量,是否有一个地方可以调用它?像 Dispose 方法,或 UserControl 类的等效方法。

谢谢,

杰夫

【问题讨论】:

    标签: wcf silverlight web-services


    【解决方案1】:

    最好只为服务提供一个实例变量。为每个调用创建和销毁服务会产生很多不必要的开销。只需创建变量并调用方法,无需打开它,因为从 beta 2 开始,这将是 done automatically(参见第 5 节)。

    至于关闭,您是否尝试关闭它以进行清理可能取决于您的应用程序的结构。如果当 UserControl 关闭时整个应用程序正在关闭(用户关闭了浏览器),那么您可能不需要显式关闭它,因为当 Silverlight 主机关闭时一切都会被清理。但是,如果您要创建大量此类用户控件并在保持应用打开的同时关闭它们,那么您可能希望在控件上创建某种关闭方法,该方法将通过调用 CloseAsync 进行清理。

    如果所有用户控件都使用相同的服务,那么您可以只创建一个服务包装类,供所有处理调用服务的控件使用。这将使您不必在控件卸载时关闭服务。

    【讨论】:

    • 当您的 silverlight 应用程序的不同部分中的 2 个控件(假设是单独的选项卡)都订阅相同的 CompletedEvent 并且一个控件调用 ....Async() 调用时,这会导致两个处理程序被调用,即使只有一个被调用?
    【解决方案2】:

    如果您的 SL 客户端中有 2 个并行事件处理程序,您可以执行以下方法来确保只有一个被调用: 假设我们有一个全局客户端变量 App.Client,应用程序中的所有内容都在使用它。 现在,控件 1 需要对 MyOperationCompleted 做出反应,控件 2 也是如此。 每个控件都像这样使用事件处理程序:

    ...
    {
        App.Client.MyOperationCompleted += Client_MyOperationCompleted;
        App.Client.MyOperationAsync(...);
    }
    
    void Client_MyOperationCompleted(object sender, MyOperationCompletedEventArgs e)
    {
        App.Client.MyOperationCompleted -= Client_MyOperationCompleted;
    }
    

    因此,如果您在一种情况下订阅了该事件,一旦它返回,您就会删除对该事件的订阅。如果您始终坚持这一点,则其他控件不太可能(但并非不可能)对事件做出反应。请注意,这种方法不是 100% 并发安全的。我仍在尝试提出一种非常安全的方法来做到这一点。但它确实有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多