powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Асинхронный конструктор
25 сообщений из 29, страница 1 из 2
Асинхронный конструктор
    #39590709
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, нижеизложенная проблема в принципе должна встречаться практически в каждом WPF - проекте, однако не очень понятно как это реализовать с использование best-practice.
Проблема: аснихронно выполнить какие-либо длительные операции при инициализации View. Кроме как использовать конструктор ViewModel я пока не могу прикинуть, но проблема -в нем нельзя await, и соответственно все операции приходиться делать синхронно.
Да, есть кастомные реализации асинхронного конструктора от Стивена Клири
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public sealed class MyClass
{
  private MyData asyncData;
  private MyClass() { ... }

  private async Task<MyClass> InitializeAsync()
  {
    asyncData = await GetDataAsync();
    return this;
  }

  public static Task<MyClass> CreateAsync()
  {
    var ret = new MyClass();
    return ret.InitializeAsync();
  }
}

public static async Task UseMyClassAsync()
{
  MyClass instance = await MyClass.CreateAsync();
}



task.run тоже вариант не очень, потому что нужно контекст подгонять, чтобы gui нормально обновился.
но для wpf данный способ реализации не очень подходит. Поделитесь опытом, кто как костылил асинхронные операции в конструкторе
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590748
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очень понял проблему и тем более, не понял, зачем пытаться замутить в конструкторе асинхронное выполнение, что мешает вызвать конструктор из асинхронного контекста.
Для синхронизации с UI из другого потока, можно воспользоваться Диспатчером, только нужно заранее сохранить ссылку на него, так как для разных потоков разные диспатчеры возвращаются
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590755
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subtask.run тоже вариант не очень, потому что нужно контекст подгонять
Ты про это?
Код: c#
1.
Action a = () => вызватьГУИ(.....


Что за трудность?
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590792
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class ViewModel
        {
//свойство для биндинга в gui
            public List<FakeObj> FakeObjList { get; set; }

            public ViewModel()
            {
                // как хотелось бы
                FakeObjList = await LoadHeavyData;
            }

            private async Task<List<FakeObj>> LoadHeavyData
            {
                //async connection To DataBase, async Reading etc 

                return List<FakeObj>>;
            }

        }
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590798
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public ViewModel()
            {
   Task.Run(async () =>
            {
              FakeObjList =  await LoadHeavyData;
   
            });

//при таком использовании гуи не обновляется, потому что FakeObjList присвоен в другом потоке-
нужно с begin invoke шаманить
            }
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590802
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Тип коллекции? Observable?
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590803
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Дай ему ссыль на твой пример биндинга. Если у него биндинг.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590805
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subкак-то так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class ViewModel
        {
//свойство для биндинга в gui
            public List<FakeObj> FakeObjList { get; set; }

            public ViewModel()
            {
                // как хотелось бы
                FakeObjList = await LoadHeavyData;
            }

            private async Task<List<FakeObj>> LoadHeavyData
            {
                //async connection To DataBase, async Reading etc 

                return List<FakeObj>>;
            }

        }


Наконец то дождались ясного ТЗ.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590808
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtes,
Дай ему ссыль на твой пример биндинга. Если у него биндинг.про какой пример речь? :)
в Binding'е есть параметр Async кстати :)
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590809
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Код: c#
1.
invoke

при Action не нужен invoke.
Объяви лист в поле с гуи и заполни из потока.
Потом через Action отправь событие: Список готов.
Должно работать 99% ))))))
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590812
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesпро какой пример речь? :)ты мне давал про ленивый биндинг в таблу.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590818
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesBinding'е есть параметр Async кстати :)да.
Итого уже 3 варианта решения)
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590837
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если Вы про IsAsync свойство биндинга, то по описанию из msdn оно обеспечивает асинхронный доступ к get.
То есть IsAsync отработает в следующем случае

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MainViewModel
    {
        private ObservableCollection<FakeObj> _FakeObjList;

        public int FakeObjList
        {
      //gui на этом этапе не провиснет
            get { return LoadHeavyData; }
        }

        private ObservableCollection<FakeObj> LoadHeavyData
        {
           //синхронная версия
                return ObservableCollection<FakeObj>;
        }
    }



В случае, если заполняем коллекцию из конструктора я не уверен, что IsAcync отработает.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590902
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subя не уверен,у компа? Проверяй все 2 варианта. А я поищу ссыль на третий.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39590988
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subкак-то так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class ViewModel
        {
//свойство для биндинга в gui
            public List<FakeObj> FakeObjList { get; set; }

            public ViewModel()
            {
                // как хотелось бы
                FakeObjList = await LoadHeavyData;
            }

            private async Task<List<FakeObj>> LoadHeavyData
            {
                //async connection To DataBase, async Reading etc 

                return List<FakeObj>>;
            }

        }


А чем плохо так:
Код: 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.
  public class ViewModel : INotifyPropertyChanged
        {
            // Тут реализуем INotifyPropertyChanged
//свойство для биндинга в gui
            private List<FakeObj> _fakeObjList;
            public List<FakeObj> FakeObjList 
            {  
                 get {return _fakeObjList; } 
                 set
                 {
                       if (_fakeObjList != value)
                      {
                            _fakeObjList = value;
                            OnPropertyChanged("FakeObjList ");
                      }
                 }
            }

            public ViewModel()
            {
               var bWorker= new BackgroundWorker();
               bWorker.DoWork += (sender, e) => { e.Result = LoadHeavyData; };
               bWorker.RunWorkerCompleted += (sender, e) => { FakeObjList  = e.Result as List<FakeObj>; }
               bWorker.RunWorkerAsync();
            }

            private List<FakeObj> LoadHeavyData
            {

                return List<FakeObj>>;
            }

        }
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591021
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав
Код: c#
1.
2.
3.
4.
var bWorker= new BackgroundWorker();
               bWorker.DoWork += (sender, e) => { e.Result = LoadHeavyData; };
               bWorker.RunWorkerCompleted += (sender, e) => { FakeObjList  = e.Result as List<FakeObj>; }
               bWorker.RunWorkerAsync();


В Task.Run строчек меньше.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591043
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,

плохо тем, что FakeObjList у тебя создается в рабочем потоке, а не в главном и при таком коде у тебя gui не обновится. То есть FakeObjList заполнится, а во вьюхе он не появится. То же самое и с task.run.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591044
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123vb_subя не уверен,у компа? Проверяй все 2 варианта. А я поищу ссыль на третий.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public sealed class MyClass
{
  private MyData asyncData;
  public MyClass()
  {
    InitializeAsync();
  }

  // BAD CODE!!
  private async void InitializeAsync()
  {
    asyncData = await GetDataAsync();
  }
}


так что bad practice.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591063
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Во первых ворой метод проверяй.
Во вторых, где ты читаешь настройки окна? Ширина, высота?
Вот после всего и запуск await.
OnLoad там или onShown.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591066
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subСупер_Пав,

плохо тем, что FakeObjList у тебя создается в рабочем потоке, а не в главном и при таком коде у тебя gui не обновится. То есть FakeObjList заполнится, а во вьюхе он не появится. То же самое и с task.run.
Хм... а для чего тогда INotifyPropertyChanged/OnPropertyChanged("FakeObjList")? Чаще всего использую именно такой подход.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591070
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,
Да. Открывается пустой грид и потом подбрасываются из потока данные. Событие срабатывает.
Можно без них и 10 сек пустое окно, потом сразу все.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591093
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subСупер_Пав,

плохо тем, что FakeObjList у тебя создается в рабочем потоке, а не в главном и при таком коде у тебя gui не обновится. То есть FakeObjList заполнится, а во вьюхе он не появится. То же самое и с task.run.
Батенька, вам учить и учить еще. Я же не зря написал про INotifyPropertyChanged
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591095
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123vb_sub,
Во первых ворой метод проверяй.
Во вторых, где ты читаешь настройки окна? Ширина, высота?
Вот после всего и запуск await.
OnLoad там или onShown.
Настройки окна нигде не читаю, использую MVVM.
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591103
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subНастройки окна нигде не читаю, использую MVVM.
В программе нет ни одной настройки, галки?
Впрочем, если все на биндинге, то действительно.
....
На ObservableCollection счас что не работает в ГУИ?
...
Рейтинг: 0 / 0
Асинхронный конструктор
    #39591137
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Ты какого фига каждые полгода один и тот же вопрос задаешь?

20814728

Roman Mejtes,
Извини, с Алексей К спутал тебя. )
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Асинхронный конструктор
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]