Почему не работает асинхронность?

Если делать в одном потоке или запустить в другом с помощью new Thread(...).Start() то все работает.
Отдельный поток
private void DownloadDataAndAddToTable()
        {
            new Thread(() =>
            {
                Invoke(() =>
                {
                    tablesForDataSave = Serialization.DownloadTable(filePath);

                    if (tablesForDataSave.Count != 0)
                    {
                        int i = 1;
                        foreach (var table in tablesForDataSave)
                        {
                            tablesForDataShow.Add(
                                table.ToDataGridView("table" + (i++).ToString()));
                            Controls.Add(tablesForDataShow[i - 2]);
                        }
                    }
                    else tablesForDataShow.Add(defaultTable);

                    MakeTableActive(1);
                });
            }).Start();
        }


Асинхронно
private async void DownloadDataAndAddToTable()
        {
            await new Task(() =>
            {
                tablesForDataSave = Serialization.DownloadTable(filePath);

                if (tablesForDataSave.Count != 0)
                {
                    int i = 1;
                    foreach (var table in tablesForDataSave)
                    {
                        tablesForDataShow.Add(
                            table.ToDataGridView("table" + (i++).ToString()));
                        Controls.Add(tablesForDataShow[i - 2]);
                    }
                }
                else tablesForDataShow.Add(defaultTable);

                MakeTableActive(1);
            });
}

Вызывается тут
private void MainForm_Load(object sender, EventArgs e)
        {
            DownloadDataAndAddToTable();
            InitEvents();
        }

В этом методе я скачиваю данные с файла и потом добавляю в DataGridView(Предполагается что их будет несколько). Но при использовании асинронности DataGridView нету.
Что вообще тут лучше использовать асинхронность или многопоточнсть?
  • Вопрос задан
  • 259 просмотров
Решения вопроса 2
petermzg
@petermzg
Самый лучший программист
Для Windows Form нужно использовать SynchronizationContext.
Вызов таска в отдельном потоке Task.Run(...).

В отдельном потоке должно делаться все, что не касается обновления UI контролов. Как только все данные для отображения подготовлены, вызываете synchContext.Post(...) для обновления UI
Ответ написан
Комментировать
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Если делать в одном потоке или запустить в другом с помощью new Thread(...).Start() то все работает.

А потом вы оборачиваете всё в Invoke. Естественно это работает. Только о многопоточности тут речи быть не может, ну и накладные расходы сначала на запуск в треде. потом на invoke. Работает оно так же как без треда, потому и показывает.

Если вы то что в таске обернёте в invoke оно тоже заработает, только так тоже неправильно.

Что вообще тут лучше использовать асинхронность или многопоточнсть?

Что-то мне подсказывает что ни то и ни то. Хз что такое Serialization.DownloadTable, но если там есть асинхронные методы, лучше их дёргать. Ну а так, подгрузка данных порциями всё решает.

Ну и теорию подтянуть надо, и практику.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@reberey172
Попробуйте в task не оборачивать, а поставить await Task.Delay(0). Если будет работать, то хорошо, но вы должны понимать, что это не решение вопроса. Это скорее маскировка проблемы.
private async void DownloadDataAndAddToTable() {
  await Task.Delay(0);
  tablesForDataSave = Serialization.DownloadTable(filePath);
  if (tablesForDataSave.Count != 0) {
    int i = 1;
    foreach (var table in tablesForDataSave) {
      tablesForDataShow.Add(
      table.ToDataGridView("table" + (i++).ToString()));
      Controls.Add(tablesForDataShow[i - 2]);
     }
  }
  else tablesForDataShow.Add(defaultTable);
   MakeTableActive(1);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы