Приложение WPF зависает при первом вызове WCF - PullRequest
2 голосов
/ 14 июля 2011

У меня есть приложение WPF, которому требуется доступ к службе WCF при запуске (окно входа в систему).Каждый раз, когда приложение работает в Windows 7, оно останавливается при входе в систему, пока не получит ответ от WCF.Есть ли способ по-другому оформить этот процесс?

Ответы [ 5 ]

4 голосов
/ 14 июля 2011

Звучит так, как будто вам нужно совершать вызовы асинхронно.Либо начните вызов в новом потоке (предпочтительно используя Task ), либо вызовите службу WCF, используя шаблон асинхронного проектирования .

2 голосов
/ 14 июля 2011

Поместить вызов WCF в фоновый поток

1 голос
/ 14 июля 2011

Есть две причины для чего-то, что воспринимается как «зависание» при выполнении сервисных вызовов WCF:

  1. Вызов службы синхронным образом заблокирует ваш поток пользовательского интерфейса до завершения вызова.Это плохо и причина, по которой Silverlight запрещает синхронные вызовы и заставляет вас следовать шаблону Begin / End Async для любого типа RPC - будь то WebRequest или WCF Layer.По умолчанию асинхронные методы не создаются при добавлении ссылки на службу в ваш проект WPF, но вы можете включить ее с помощью Настроить ссылку на службу.
  2. Вторая причина менее очевидна.Первоначальная реализация клиента службы может занять почти 3 секунды - даже на быстрых машинах.Вот почему вам настоятельно рекомендуется использовать QueueWorkUserItem для создания прокси-сервера и вызова BeginXXX даже при использовании асинхронного шаблона.
0 голосов
/ 16 мая 2013

Вы вызываете вызов WCF в главном потоке, поэтому он будет зависать.

  • Вы также можете поместить это в ветку и вызвать в начале вашего приложения. Поместите его в фоновый процесс (если вы работаете в visual studio, вы можете перетащить его с панели инструментов)

Вы можете создавать потоки довольно легко, определив Thread, затем определив startstart, передав свой вызов WCF для входа в систему и вызов thread.start (); и передайте определение потока, которое вы определили.

Фоновый рабочий очень похож, вы можете поместить свой код в метод backgroundWorker1_DoWork ()

  • Или сделайте ваш WCF-вызов Async, чтобы он отправлял ответ на вход в систему, а ваш код для входа в систему будет вызывать метод "OnTaskCompleted" (вы также можете поместить его в новый поток, но на самом деле это не так. к)

Попробуйте эту тему для асинхронных вызовов WCF

Как сделать вызов к моей службе WCF асинхронным?

0 голосов
/ 14 июля 2011

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

Если вам не нужно значение повторного запуска из этого метода службы, вы можете использовать [OperationContract (IsOneWay = true)] в своей службе,Так что вам не нужно беспокоиться о потоках и прочем.

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