2013-12-18 2 views
0

При разработке приложения WPF с услугой WCF я понял, что иногда приложение работает очень медленно. Например, когда я вызываю метод из службы WCF, которая возвращает список, для выполнения этого требуется слишком много времени. Вот код:Есть ли способ сделать работу wpf + wcf быстрее?

MVVM:

private ObservableCollection<tblStock> _Stocks; 
public ObservableCollection<tblStock> Stocks 
{ 
    get 
    { 
     return _Stocks; 
    } 
    set 
    {    
     _Stocks = value; 
     OnPropertyChanged("Stocks"); 
    } 
} 

private ObservableCollection<tblClient> _Clients; 
public ObservableCollection<tblClient> Clients 
{ 
    get 
    { 
     return _Clients; 
    } 
    set 
    {     
     _Clients = value; 
     OnPropertyChanged("Clients"); 
    } 
} 

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

Clients = new ObservableCollection<tblClient>(wcf.GetClients()); 
Stocks = new ObservableCollection<tblStock>(wcf.GetStocks());  

занимает около 7 - 10 секунд, иногда, чтобы загрузить эти выпадающие списки, когда откроется окно. Я не понимаю, почему так много времени требуется, когда количество списков действительно мало: 2 и 8 элементов. Вот методы на ФОС службы:

List<tblClient> IService.GetClients() 
{ 
    context = new PanErpLiteEntities(); 
    List<tblClient> cntnt = (from c in context.tblClients select c).ToList(); 
    return cntnt; 
} 

Так что мой актуальный вопрос: каковы возможные причины замедления моего приложения? Я опубликовал этот вопрос, потому что мне было трудно найти ответ на google, когда есть миллионы причин, заставляющих приложение работать медленно, поэтому я нахожусь здесь для советов. Надеюсь, я сделал себе достаточно ясно.

+0

Сколько времени требуется, чтобы получить данные по WCF? Я не знаком с WCF, но вы пробовали сделать свою привязку async? (в строке привязки IsAsync = True). – Alan

+0

Профиль приложения.Сначала определите, работает ли служба wcf медленнее или ваши привязки. –

+0

Возможно ли, что услуга не «развернулась»? Возможно, именно то, что вы видите, это время запуска службы. Попробуйте запустить приложение, а затем немедленно отключите его. Затем запустите его снова. Если он запускается намного быстрее во второй раз, эта длительная задержка, которую вы видите первоначально, является, скорее всего, временем запуска службы. –

ответ

2

Вы нашли миллион вещей в Google, потому что может быть миллион вещей, которые могут вызвать медленность. Что вам нужно сделать, так это узнать, как определить, где медлительность, например, «Профилирование».

В вашей ситуации есть 3 вещи, которые необходимо профилировать.

  • Где все тоже клиентская программа висит
  • Время, необходимое для запроса WCF и ответа пересечь проволочный
  • Где List<tblClient> IService.GetClients() проводят большую часть времени.

Для первого и третьего предметов вам нужен профайлер кода. Существует один built in to Visual Studio, есть также много free and paid 3rd party ones available too.

Для 2-го пункта вы можете enable tracing in WCF itself, это может быть так же просто, как добавить к вашему App.config файл на сервере.

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\log\Traces.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

При закрытии сервера рядом вы можете просмотреть Traces.svclog в «Service Трассировка просмотра», который поставляется с Visual Studio (вы также можете включить autoFlush и не нужно ждать, пока сервис будет остановлен, чтобы промыть буферов, но это даст вам удар производительности).

После того, как у вас есть все, что новая информация вы можете вернуться сюда и сделать новый вопрос, как «Как сделать первый запрос сервер WCF выполняет быстрее?» или "Почему это Entity Framework запрос занимает так long "или что-то еще полностью.

+0

Благодарим вас за быстрый повтор и это действительно описательные советы. В качестве новичка мне было слишком сложно начать исследование о возможной причине этой проблемы. Спасибо, что напомнили мне, с чего начать. – Stojdza

+0

Информативный, но не ответ на вопрос. Должен быть блогпост, на который вы ссылаетесь в комментариях. Было бы неплохо, определенно. – Will

Смежные вопросы