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