使用支持Silverlight的WCF服务时,实例化服务和调用CloseAsync()方法的最佳位置在哪里?
您是否应该说,每次需要调用服务时实例化一个实例,或者将实例实例化为将要进行调用的UserControl变量?
那么,调用CloseAsync方法更好的地方在哪里?你应该在每个“someServiceCall_completed”事件方法中调用它吗?或者,如果创建为UserControl类的变量,是否有一个地方可以调用它?像Dispose方法,或UserControl类的等效方法。
谢谢,
杰夫
答案 0 :(得分:3)
你最好只为服务设置一个实例变量。为每个调用创建和销毁服务会产生大量不必要的开销。只需创建变量并调用方法,无需打开它,因为从beta 2开始这将是done automatically(参见第5节)。
至于关闭,您是否尝试关闭它以进行清理可能取决于您的应用程序的结构。如果UserControl关闭时整个应用程序正在关闭(用户关闭了浏览器),那么您可能不需要显式关闭它,因为Silverlight主机关闭时所有内容都会被清除。但是,如果您创建了大量这些用户控件并在保持应用程序打开的同时关闭它们,那么您可能希望在控件上创建某种类型的close方法,通过调用CloseAsync进行清理。
如果所有用户控件都使用相同的服务,那么您可以创建一个服务包装器类,由处理调用服务的所有控件使用。这样可以避免在控件卸载时关闭服务。
答案 1 :(得分:1)
对于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%并发安全。我仍然试图想出一个非常安全的方法来做到这一点。但它确实有帮助。