我正在开发Silverlight / WCF应用程序,当然在Silverlight程序中有许多异步调用。我想知道如何处理客户端类和订阅的创建的最佳方法。具体来说,如果我订阅一个方法中的事件,它返回后它是否超出范围?
internal MyClass
{
public void OnMyButtonClicked()
{
var wcfClient = new WcfClient();
wcfClient.SomeMethodFinished += OnMethodCompleted;
wcfClient.SomeMethodAsync();
}
private void OnMethodCompleted(object sender, EventArgs args)
{
//Do something with the result
//After this method does the subscription to the event
//fall out of scope for garbage collection?
}
}
如果我再次调用该函数并创建另一个订阅,我会遇到问题吗?
提前感谢任何回复的人。
答案 0 :(得分:3)
您不应该让WCF客户端代理完全超出此范围。您的代码将起作用,但它也会泄漏资源。 WCF客户端都实现IDisposable
,但这是一个不能只使用using
或Dispose
的情况; Service Proxy Helper可用于同步操作,但其中的清理代码演示了如何在任何上下文中安全地处理客户端。
在进行像这样的异步操作时,需要以类似的方式管理该客户端的生命周期。通常,无论什么类“拥有”,WCF客户端都应该实现IDisposable
本身,在某个私有字段中保留对该客户端的引用,并在其处理方法中调用客户端上的Close
/ Abort
通常,实际实现异步回调方法的类将成为所有者,因此该类应该管理生命周期;因此,如果你真的需要一个“按需”客户端,那么在回调完成后执行清理也是有意义的。
WCF客户端也不便宜创建,所以你应该尽可能长时间地保持它们并且不要像这样特别创建它们;将它们视为应用程序范围的依赖关系。
如果你只是保留客户端实例,那么你也不需要继续订阅它的事件;这个问题有效消失了。
答案 1 :(得分:2)
你不会遇到问题。它会生成一个新的WcfClient
实例,两者都会在完成时调用您的OnMethodCompleted
回调。