Я получил много хороших комментариев по этому вопросу, но ни одного хорошего шаблона, который я мог бы использовать в своем приложении.Я публикую здесь то, что в итоге сделал, как мой ответ, и, надеюсь, это поможет кому-то еще в будущем.
Автоматически созданный прокси WCF создает методы вызова синхронизации, асинхронные методы с использованием шаблона начала / конца и делегаты на основе события с использованием события Completed.В примере, который я разместил выше в своем первоначальном вопросе, использовался шаблон «Начало / Конец».Проблема состоит в том, что когда обратный вызов сделан, вам нужно будет выполнить Invoke для доступа к вашему потоку пользовательского интерфейса.Если этот поток пользовательского интерфейса больше не существует (т.е. пользователь закрыл окно), у вас есть проблемы.Новый шаблон, основанный на событиях, автоматически находит свой путь назад к потоку пользовательского интерфейса, и из моего тестирования я не смог заставить его завершиться сбоем, закрывшись до завершения службы.Я предполагаю, что прокси достаточно умен, чтобы НЕ вызывать завершенный обработчик, если адрес памяти не существует?Или, может быть, он зависает от адреса памяти обработчику, поэтому он не будет собирать мусор?Поэтому все, что вам нужно сделать, это добавить обработчик события Completed, завершить вызов и т. Д., ServicenameAsync () и дождаться его возврата в ваш обработчик (в потоке пользовательского интерфейса).Я также, просто чтобы убедиться, обернул свои законченные обработчики в блоки try / catch для обработки ObjectDisposedExceptions, если таковые имеются.
Главное сейчас: ЭТО НЕ РАБОТАЕТ.
Одна ошибка (по крайней мере, для меня) ... Я использовал шаблон синглтона для доступа к моей службе WCF.Проблема в том, что он создает статическую ссылку на ваш прокси WCF, используемую во всем приложении.Звучит удобно, но когда вы добавляете обработчики событий к событиям Completed непосредственно перед тем, как выполнить асинхронный вызов, они могут дублироваться, дублироваться и т. Д. Каждый раз, когда вы делаете вызов, вы добавляете ДРУГОЙ обработчик завершенных событий в дополнение к одному.уже добавлен в ваш статический прокси WCF.Чтобы решить эту проблему, я начал объявлять новых прокси-клиентов для каждого вызова или, если для каждого класса winform не выполняется несколько вызовов, для каждой формы win.Если у кого-то есть комментарии по этому или лучшему способу, ПОЖАЛУЙСТА, дайте мне знать!Самая большая проблема с одноэлементным шаблоном заключается в том, что если у вас открыто несколько окон (разных классов), которые вызывают один и тот же асинхронный метод, но вы хотите, чтобы они возвращались к различным обработчикам Completed, вы не сможете этого сделать.