垃圾收集器是否清理了Web服务引用,或者在调完我调用的任何方法后是否需要在服务引用上调用dispose?
答案 0 :(得分:23)
您可以使用singleton pattern,而不是担心处理您的网络服务,而只能保留每个网络服务的单个实例。 Web服务是无状态的,因此可以安全地在Web服务器上的连接和线程之间共享。
以下是可用于保存对Web服务实例的引用的Web Service类的示例。这个单例是懒惰和线程安全的。建议如果你使单身人员懒惰,他们也会遵循相同的逻辑保持线程安全。要了解有关如何执行此操作的详细信息,请阅读Implementing Singletons上的C#In Depth文章。
另请注意,您可能会遇到WCF Web服务的问题。我建议您阅读WCF's instance management techniques article,特别是单身人士部分,了解更多详情。
public static class WS
{
private static object sync = new object();
private static MyWebService _MyWebServiceInstance;
public static MyWebService MyWebServiceInstance
{
get
{
if (_MyWebServiceInstance == null)
{
lock (sync)
{
if (_MyWebServiceInstance == null)
{
_MyWebServiceInstance= new MyWebService();
}
}
}
return _MyWebServiceInstance;
}
}
}
然后当您需要访问您的Web服务时,您可以执行以下操作:
WS.MyWebServiceInstance.MyMethod(...)
或
var ws = WS.MyWebServiceInstance;
ws.MyMethod(...)
我已经在几个项目中成功使用了这种模式并且运行良好,但正如tvanfosson在下面的评论中提到的,更好的策略是使用DI框架来管理您的Web服务实例。
答案 1 :(得分:1)
我认为DataService从Component继承了Dispose。
答案 2 :(得分:1)
实现IDispose的对象应手动处理以协助垃圾收集器。
如果您的对象是短暂的,请使用using
块。对于可以保留的对象,确保它们保留的对象在处理它们时将它们处理掉。
答案 3 :(得分:0)
如果您担心性能,那么我会更担心托管Web服务的服务器的响应能力和网络速度,因为它们会极大地影响您必须等待Web服务调用完成的时间长度(除非它异步)。
MSDN上的示例不要调用'Dispose',而且很明显垃圾收集器会完成它的工作,所以除非你在每秒需要处理超过100,000条记录的实时系统上工作,否则你可能不需要想出一种处理资源或管理记忆的方法。
答案 4 :(得分:0)
我认为上述回答中 Seabizkit 的担忧是非常合理的。 此处引用:
<块引用>@DanHerbert 当两个线程调用单例时会发生什么......让我解释一下......对象上有一个锁......以使其线程安全。这是否意味着如果 theard1 调用访问 webInstance,则 thread2 将等待 thread1 完成。或者是纯粹用于创建实例的锁。假设您有 10 个呼叫者.... 锁定是否意味着他们被链接...或异步,我想您会得到我要问的内容,如果不清楚,请告诉我。 – Seabizkit 2016 年 10 月 13 日 10:01 <
在我完成一些测试之后,我可以看出当多个不同的线程使用单个“客户端”对象时,您将无法获得任何良好的性能。 如果创建了 10 个线程并且它们都使用同一个单例“客户端”,那么它们将不得不排队等待,直到所有先前的调用都完成。
要查看证明,请在此处阅读并运行这篇 c-sharp 角文章中的示例: https://www.c-sharpcorner.com/article/increase-performance-with-an-object-pool-or-why-singleton-may-cause-performance/ 标题为“使用对象池提高性能或为什么单例可能会导致性能问题”。
很抱歉打破了单例 Web 服务用户的泡沫。此外,您将很难找到 Microsoft 的示例,其中 Web 服务客户端被“囚禁”在单例中。