Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
1

Асинхронные команды в MVVM

05.12.2016, 21:44. Просмотров 2082. Ответов 7
Метки нет (Все метки)


Как реализуются асинхронные команды при использования паттерна MVVM? В том коде что я привел ниже в методе, компилятор жалуется на то что лямба будет выполняться синхронно (подчеркивает async), хотя то что мне нужно выполняется, мне необходимо чтоб метод start отработал во втором потоке и по его завершению выполнились другие функции, но как я понял в wpf все что идет после await выполняется в GUI потоке, я создаю еще один поток для методов. Или все таки я не до конца понимаю как работает мой код ?


Реализация интерфейса ICommand
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class CommandHandler : ICommand
 
  {
 
    public event EventHandler CanExecuteChanged;
 
    private Action<object> _action;
 
    private Func<object, bool> _canExecute;
 
    public CommandHandler(Action<object> action, Func<object, bool> canExecute)
 
    {
 
      _action = action;
 
      _canExecute = canExecute;
 
    }
 
    public bool CanExecute(object parameter)
 
    {
 
      return _canExecute(parameter);
 
    }
 
    public void PassCanExecuteChanged()
 
    {
 
      if (CanExecuteChanged != null)
 
        CanExecuteChanged(this, EventArgs.Empty);
 
    }
 
    public void Execute(object parameter)
 
    {
 
      if (!_canExecute(parameter))
 
        throw new SecurityException();
 
      _action(parameter);
 
    }
}


Код метода
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private CommandHandler _startAllExperiments;
 
    public CommandHandler StartAllExperiments
 
    {
 
      get
 
      {
 
        if (_startAllExperiments == null)
 
        {
 
          _startAllExperiments = new CommandHandler(async (param) =>
 
          {
 
            _cancellationTokenSource = new CancellationTokenSource();
 
            _cancellationToken = _cancellationTokenSource.Token;
 
            _state = ProcessState.isWorking;
 
            while (!_cancellationToken.IsCancellationRequested)
            {
              foreach (var exp in Experiments)
              {
 
                CurrentExperiment = exp;
 
                await Task.Run(() =>
 
                {
                  exp.Start();
 
                });
 
                await Task.Run(() =>
                {
                 exp?.DrawChart();
                 CurrentExperimentInfo = exp?.GetInfo();
                });
              }
 
              _cancellationTokenSource.Cancel();
 
            }
 
            _state = ProcessState.isFree;
 
          }, param => _state == ProcessState.isFree);
 
          _commandHandlers.Add((_startAllExperiments));
 
        }
 
       return _startAllExperiments;
 
      }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2016, 21:44
Ответы с готовыми решениями:

WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html На практике часто...

WPF.MVVM и команды
Доброго дня. При изучении команд в MVVM столкнулся с проблемой включения и отключения. есть...

MVVM одинаковые команды
Добрый день. Подскажите как быть, так получилось, что пользователь требует чтобы приложение...

Выполнение команды при нажатии на label mvvm
Привет всем, можете подсказать, уважаемые форумчане, как при нажатии на label выполнялась какая-то...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
7
138 / 135 / 22
Регистрация: 16.02.2012
Сообщений: 453
05.12.2016, 23:49 2
Цитата Сообщение от slavka_online Посмотреть сообщение
но как я понял в wpf все что идет после await выполняется в GUI потоке
Неправильно вы поняли. Рекомендую посмотреть Видео курс C# Professional. Урок 15. Async Await:
0
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
05.12.2016, 23:53  [ТС] 3
Не могу открыть видео, в книге Рихтера было написано что в Wpf все что идет после await выполняется в GUI потоке, а в ASP.NET в потоке из пула потоков
0
138 / 135 / 22
Регистрация: 16.02.2012
Сообщений: 453
05.12.2016, 23:55 4
Вот правильная ссылка

0
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
05.12.2016, 23:58  [ТС] 5
Я смотрел это видео, но оратора не могу воспринять, я наверное уже почти все самые известные книги для С# пересмотрел относительно этой темы, но там везде отдельные участки кода.
0
138 / 135 / 22
Регистрация: 16.02.2012
Сообщений: 453
06.12.2016, 00:00 6
В таком случае странно, что вы задаёте такие вопросы, там подробно разбирается что и где выполняется в каком потоке.
По асинхронным командам я бы посмотрел здесь:
https://community.devexpress.c... mands.aspx
0
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
06.12.2016, 00:07  [ТС] 7
я не понимаю почему мой код работает, то есть если я хочу чтобы мой метод по-любому выполнял сигнатуру Task.Run( () =>...).ContunueWith(() =>..) я могу внутрь метода помещать await Task.Run( () => ...); и все что пойдет ниже выполнится обязательно после завершения потока, даже если снаружи метод я вызову без await ?
0
5 / 5 / 7
Регистрация: 09.03.2016
Сообщений: 89
07.12.2016, 11:55 8
Посмотрите http://blog.mycupof.net/2012/0... velopment/
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2016, 11:55

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Избежать одновременного выполнения LostFocus и команды кнопки MVVM
Помогите пожалуйста много об этом спрашивали, но ответа так и не нашла, может кто-то уже решил...

Как разбить WPF, MVVM по проектах? Пример команды
добрый день, я делаю большой проект на WPF с использованием паттерна MVVM. как мне его правильно...

WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Для использования и...

Для чего могут понадобиться асинхронные команды?
Подскажите пожалуйста для чего могут понадобиться асинхронные комманды? и если не сложно, то очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.