Где лучше всего создать экземпляр и закрыть службу WCF с поддержкой Silverlight из приложения Silverlight? - PullRequest
3 голосов
/ 10 ноября 2008

При использовании службы WCF с поддержкой Silverlight, где лучше всего создать экземпляр службы и вызвать метод CloseAsync ()?

Должны ли вы сказать, создавать экземпляр экземпляра каждый раз, когда вам нужно сделать вызов службе, или лучше просто создать экземпляр экземпляра в виде переменной UserControl, которая будет выполнять вызовы?

Тогда где лучше вызывать метод CloseAsync? Вы должны вызывать его в каждом из методов события "someServiceCall_completed"? Или, если он создан как переменная класса UserControl, есть ли место для его вызова? Как метод Dispose или что-то эквивалентное для класса UserControl.

Спасибо

Jeff

Ответы [ 2 ]

3 голосов
/ 11 ноября 2008

Вам лучше иметь переменную экземпляра для службы. Создание и удаление службы для каждого вызова создает много ненужных накладных расходов. Просто создайте переменную и вызовите методы, нет необходимости открывать ее, так как это будет , автоматически начиная с бета 2 (см. Раздел # 5).

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

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

1 голос
/ 15 июня 2010

В случае двух параллельных обработчиков событий в вашем клиенте SL вы можете использовать следующий подход, чтобы убедиться, что вызывается только один: Предположим, у нас есть глобальная клиентская переменная App.Client, которая используется всем приложением. Теперь элемент управления 1 должен реагировать на MyOperationCompleted, как и элемент управления 2. Каждый элемент управления использует обработчик событий следующим образом:

...
{
    App.Client.MyOperationCompleted += Client_MyOperationCompleted;
    App.Client.MyOperationAsync(...);
}

void Client_MyOperationCompleted(object sender, MyOperationCompletedEventArgs e)
{
    App.Client.MyOperationCompleted -= Client_MyOperationCompleted;
}

Таким образом, если вы подписываетесь на событие в одном случае, как только оно возвращается, вы удаляете подписку на это событие. Если вы всегда будете придерживаться этого, то маловероятно (но не невозможно), что другие элементы управления отреагируют на событие. Обратите внимание, что этот подход не безопасен на 100%. Я все еще пытаюсь найти действительно безопасный способ сделать это. Но это, безусловно, помогает.

...