从Silverlight应用程序实例化和关闭启用Silverlight的WCF服务的最佳位置是哪里?

从Silverlight应用程序实例化和关闭启用Silverlight的WCF服务的最佳位置是哪里?,wcf,silverlight,web-services,Wcf,Silverlight,Web Services,当使用支持Silverlight的WCF服务时,实例化服务和调用CloseAsync()方法的最佳位置在哪里 您应该说,每次需要调用服务时都要实例化一个实例,还是只实例化一个实例作为将要进行调用的UserControl的变量更好 那么,在哪里调用CloseAsync方法更好呢?您是否应该在每个“someServiceCall\u completed”事件方法中调用它?或者,如果创建为UserControl类的变量,是否有一个地方可以调用它?比如Dispose方法,或者UserControl类的等

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

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

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

谢谢


Jeff

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

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


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

在SL客户端中有两个并行事件处理程序的情况下,您可以通过以下方法确保只调用一个: 假设我们有一个全局客户端变量App.client,应用程序中的所有东西都在使用它。 现在,控件1需要在操作完成时做出反应,控件2也需要这样做。 每个控件使用eventhandler,如下所示:

...
{
    App.Client.MyOperationCompleted += Client_MyOperationCompleted;
    App.Client.MyOperationAsync(...);
}

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

因此,如果您在一种情况下订阅了该事件,那么一旦它返回,您就会删除对该事件的订阅。如果您始终坚持这一点,那么其他控件对事件做出反应的可能性很小(但并非不可能)。注意,这种方法不是100%并发安全的。我仍在努力想出一个真正安全的方法来做这件事。但是它确实有帮助。

如果silverlight应用程序的两个单独部分中的两个控件(比如单独的选项卡)都订阅了相同的CompletedEvent,并且一个控件调用了….Async()调用,这会导致两个处理程序都被调用,即使只有一个处理程序被调用,该怎么办?