10

垃圾收集器是否清理 Web 服务引用,或者在我调用完我调用的任何方法后,我是否需要在服务引用上调用 dispose?

4

5 回答 5

23

您可以使用单例模式只保留每个 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 服务实例。

于 2009-01-09T20:03:55.273 回答
1

我认为 DataService 从 Component 继承 Dispose。

于 2009-01-09T20:27:23.450 回答
1

应手动处理实现 IDispose 的对象以协助垃圾收集器。

如果您的反对是短暂的,请使用using块。对于可以保留的对象,请确保保留它们的对象在也处置它们时处置它们。

于 2009-03-17T06:19:01.853 回答
0

你想在这里完成什么?

如果您担心性能,那么我会更担心托管 Web 服务的服务器的响应能力和网络速度,因为它们会极大地影响您必须等待 Web 服务调用完成的时间长度(除非它是异步的)。

MSDN 上的示例不调用“Dispose”,并且很明显垃圾收集器会完成其工作,因此除非您在需要每秒处理内存中超过 100,000 条记录的实时系统上工作,否则您可能不需要上来通过一种方式来处理资源或管理内存。

于 2009-01-16T03:59:20.663 回答
0

我认为上述答案中 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 服务客户端被“囚禁”在单例中。

于 2021-07-03T04:22:40.840 回答