Нужно ли размещать ссылку на веб-сервис в ASP.NET? - PullRequest
10 голосов
/ 09 января 2009

Удаляет ли сборщик мусора ссылки на веб-службы или мне нужно вызвать dispose для ссылки на службу после того, как я завершу вызов любого метода, который я вызываю?

Ответы [ 4 ]

23 голосов
/ 09 января 2009

Вместо того, чтобы беспокоиться об утилизации ваших веб-сервисов, вы можете хранить только один экземпляр каждого веб-сервиса, используя шаблон синглтона . Веб-службы не имеют состояния, поэтому их можно безопасно разделить между подключениями и потоками на веб-сервере.

Ниже приведен пример класса веб-службы, который можно использовать для хранения ссылок на экземпляры веб-службы. Этот синглтон ленив и потокобезопасен. Рекомендуется, чтобы ваши ленивцы оставались ленивыми, а также обеспечивали безопасность потоков, следуя той же логике. Чтобы узнать больше о том, как это сделать, прочитайте статью C # In Depth на Реализация синглетонов .

Также имейте в виду, что у вас могут возникнуть проблемы с веб-службами WCF. Я бы порекомендовал прочитать статью о методах управления экземплярами 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 для управления экземплярами веб-служб.

1 голос
/ 17 марта 2009

Объекты, реализующие IDispose, следует утилизировать вручную, чтобы помочь сборщику мусора.

Если ваш объект недолговечный, используйте блок using. Для объектов, которые могут быть сохранены, убедитесь, что объект, который их удерживает, удаляет их, когда он также удаляется.

1 голос
/ 09 января 2009

Я думаю, что DataService наследует Dispose от Component.

0 голосов
/ 16 января 2009

что вы пытаетесь достичь здесь?

Если вас беспокоит производительность, то я бы больше беспокоился об отзывчивости сервера, на котором размещен веб-сервис, и скорости сети, поскольку они могут существенно повлиять на продолжительность ожидания вызова веб-сервиса (если только асинхронный).

Примеры в MSDN не вызывают «Dispose», и совершенно очевидно, что сборщик мусора выполнит свою работу, поэтому, если вы не работаете в системе реального времени, которая должна обрабатывать более 100 000 записей в памяти каждую секунду, то, возможно, вам не нужно придумать способ распоряжаться ресурсами или управлять памятью.

...