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();
}
SynchronizationContext
.Task.Run(...)
.synchContext.Post(...) для обновления UI
Если делать в одном потоке или запустить в другом с помощью new Thread(...).Start() то все работает.
Что вообще тут лучше использовать асинхронность или многопоточнсть?
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);
}