C # Асинхронный вызов мусора - PullRequest
3 голосов
/ 24 марта 2010

Я работаю над приложением 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?
    }
}

Будут ли у меня проблемы, если я снова вызову функцию и создам другую подписку?

Заранее спасибо всем, кто откликнулся.

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

Вы не должны позволять клиентским прокси WCF просто выпадать из этой области. Ваш код будет работать, но он также будет пропускать ресурсы. Все клиенты WCF реализуют IDisposable, но это один из случаев, когда нельзя просто использовать using или Dispose; Service Proxy Helper можно использовать для синхронных операций, но приведенный там код очистки демонстрирует, как безопасно избавиться от клиента в любом контексте.

При выполнении асинхронных операций, подобных этой, что-то должно быть аналогичным образом для управления временем жизни этого клиента. Обычно любой класс, которому «принадлежит» клиент WCF, должен сам реализовать IDisposable, хранить ссылку на этого клиента в приватном поле и вызывать Close / Abort на клиенте в своем методе удаления.

Как правило, любой класс, который фактически реализует асинхронный метод обратного вызова, будет владельцем, и поэтому этот класс должен управлять временем жизни; поэтому, если вам действительно нужен клиент «по требованию», может также иметь смысл выполнить очистку после завершения обратного вызова.

Создание клиентов WCF тоже не из дешевых, поэтому вам следует постараться сохранить их как можно дольше, а не создавать их как бы специально; думайте о них как о зависимостях всего приложения.

Если вы просто держите экземпляр клиента рядом, то вам также не нужно продолжать подписываться на его события; вопрос фактически уходит.

2 голосов
/ 24 марта 2010

У вас не будет проблем. Он создаст новый экземпляр WcfClient, и оба будут вызывать ваш OnMethodCompleted обратный вызов по завершении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...