2016-01-07 3 views
2

Я недавно пытался изучить процесс использования Task в WPF и столкнулся с проблемой, которая, скорее всего, объясняется нехваткой опыта. При выполнении асинхронного вызова метода dataservice «GetFutureWork» поток пользовательского интерфейса становится невосприимчивым. Код можно увидеть ниже. Обратите внимание, что в этом проекте используется MVVM, а переменная «WorkList» - это просто наблюдаемая коллекция, используемая для моего источника itemListiview.Пользовательский интерфейс блокировки задач в WPF

private async void LoadWork() 
    { 
     WorkList = await _dataService.GetFutureWork("UserNameHere"); 
    } 

DataService Задача

public async Task<IEnumerable<FutureWork>> GetFutureWork(string userName) 
    { 
     using (_db = new DataEntities()) 
     { 
      var workList = await (from items in _db.REPAIR_CHECK_IN_TABLEs 
       where items.LOCATION == userName && items.COMPLETED == "N" 
       select new FutureWork 
       { 
        FormattedDate = items.EstShipDate.ToString(), 
        ServiceID = items.SERVICE_ID, 
        ImagePath = @"\\192.168.5.50\photos$\" + items.SERVICE_ID + "P1.bmp", 
        Priority = items.PRIORITY 
       }).ToListAsync(); 
      return workList; 
     } 
    } 
+0

Вызывается ли 'LoadWork()' из потока пользовательского интерфейса? Что вызывает этот метод? Сколько времени занимает конструктор 'DataEntities'? В нем что-то особенное? –

+0

Да LoadWork вызывается из потока пользовательского интерфейса. Он вызывается из конструктора viewmodel. 'public FutureWorkViewModel (IDataService dataService) { _dataService = dataService; LoadWork(); } 'Конструктор данных состоит из 145 мс, поэтому я чувствую, что это может не быть виноватым. – HighARc

+0

вам нужно подождать LoadWork(); также – axlj

ответ

2

Вы не можете вызвать функцию асинхронной из окна конструктора, так как уже упоминалось, вам нужен другой способ.

Вы можете использовать событие Window_Loaded вместо конструктора.

private async void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    await LoadWork(); 
} 

Затем подключить его:

<Window x:Class="AsyncWindow.MainWindow" ... Loaded="Window_Loaded"> 

EDIT:

Если вы предпочитаете придерживаться шаблона MVVM, альтернативное решение опубликовано here.

+1

Спасибо за это, см. ссылку I выше. Я достиг такого же исправления, сохраняя при этом шаблон проектирования MVVM. – HighARc

+0

Ах идеальный. Я определенно предпочел бы этот путь по пути, который я предлагал. Благодаря! – axlj

+0

Я обновил свой ответ, чтобы включить ссылку, которую вы упомянули, чтобы другим не нужно было копаться в комментариях, чтобы найти ее. – axlj

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