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

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

05.12.2016, 21:44. Показов 3840. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2016, 21:44
Ответы с готовыми решениями:

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

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

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

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

0
 Аватар для slavka_online
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
05.12.2016, 23:58  [ТС]
Я смотрел это видео, но оратора не могу воспринять, я наверное уже почти все самые известные книги для С# пересмотрел относительно этой темы, но там везде отдельные участки кода.
0
 Аватар для SharpDeveloper
141 / 138 / 22
Регистрация: 16.02.2012
Сообщений: 453
06.12.2016, 00:00
В таком случае странно, что вы задаёте такие вопросы, там подробно разбирается что и где выполняется в каком потоке.
По асинхронным командам я бы посмотрел здесь:
https://community.devexpress.c... mands.aspx
0
 Аватар для slavka_online
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 102
06.12.2016, 00:07  [ТС]
я не понимаю почему мой код работает, то есть если я хочу чтобы мой метод по-любому выполнял сигнатуру Task.Run( () =>...).ContunueWith(() =>..) я могу внутрь метода помещать await Task.Run( () => ...); и все что пойдет ниже выполнится обязательно после завершения потока, даже если снаружи метод я вызову без await ?
0
5 / 5 / 7
Регистрация: 09.03.2016
Сообщений: 89
07.12.2016, 11:55
Посмотрите http://blog.mycupof.net/2012/0... velopment/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2016, 11:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru