Foreach循环冻结ui C#



我有一个任务,它用数据表中的数据填充可观察的集合。

问题是,当我运行这个程序时,UI会在冻结1秒

Map.Add(mapCollection);

我尝试过,但没有成功

Task.Run

整个代码如下:

private async Task<ObservableCollection<ShiftPageListItemViewModel>> GetMapAsync()
{
mDbConnect = new DBConnect();
var ShiftsTab = new DataTable();
ShiftsTab = await mDbConnect.MapAsync(Date.ToString("yyyy-MM-dd"));
var Map = new ObservableCollection<ShiftPageListItemViewModel>();

foreach (DataRow row in ShiftsTab.Rows)
{
var mapCollection = new ShiftPageListItemViewModel
{
BorderTag = row[0].ToString(),
Name = row[1].ToString(),
HourTitle = ShiftsTab.Rows.IndexOf(row) < 10 ? $"Ora0{ShiftsTab.Rows.IndexOf(row)}" : $"Ora{ShiftsTab.Rows.IndexOf(row)}",
Ora00 = Convert.ToDouble(row[2].ToString()),
Ora01 = Convert.ToDouble(row[3].ToString()),
Ora02 = Convert.ToDouble(row[4].ToString()),
Ora03 = Convert.ToDouble(row[5].ToString()),
Ora04 = Convert.ToDouble(row[6].ToString()),
Ora05 = Convert.ToDouble(row[7].ToString()),
Ora06 = Convert.ToDouble(row[8].ToString()),
Ora07 = Convert.ToDouble(row[9].ToString()),
Ora08 = Convert.ToDouble(row[10].ToString()),
Ora09 = Convert.ToDouble(row[11].ToString()),
Ora10 = Convert.ToDouble(row[12].ToString()),
Ora11 = Convert.ToDouble(row[13].ToString()),
Ora12 = Convert.ToDouble(row[14].ToString()),
Ora13 = Convert.ToDouble(row[15].ToString()),
Ora14 = Convert.ToDouble(row[16].ToString()),
Ora15 = Convert.ToDouble(row[17].ToString()),
Ora16 = Convert.ToDouble(row[18].ToString()),
Ora17 = Convert.ToDouble(row[19].ToString()),
Ora18 = Convert.ToDouble(row[20].ToString()),
Ora19 = Convert.ToDouble(row[21].ToString()),
Ora20 = Convert.ToDouble(row[22].ToString()),
Ora21 = Convert.ToDouble(row[23].ToString()),
Ora22 = Convert.ToDouble(row[24].ToString()),
Ora23 = Convert.ToDouble(row[25].ToString()),
};
Map.Add(mapCollection);
}; 
return Map;
}

有人能帮我吗,我只想在不冻结ui 的情况下运行这个

您是说Task.Run不适合您。也许你忘记了await关键字?

将计算成本高昂的代码封装到await Task.Run(() => {...});中,如下所示:

private async Task<ObservableCollection<ShiftPageListItemViewModel>> GetMapAsync()
{
mDbConnect = new DBConnect();
var ShiftsTab = new DataTable();
ShiftsTab = await mDbConnect.MapAsync(Date.ToString("yyyy-MM-dd"));
var Map = new ObservableCollection<ShiftPageListItemViewModel>();
await Task.Run(() =>
{
foreach (DataRow row in ShiftsTab.Rows)
{
var mapCollection = new ShiftPageListItemViewModel
{
BorderTag = row[0].ToString(),
Name = row[1].ToString(),
HourTitle = ShiftsTab.Rows.IndexOf(row) < 10 ? $"Ora0{ShiftsTab.Rows.IndexOf(row)}" : $"Ora{ShiftsTab.Rows.IndexOf(row)}",
Ora00 = Convert.ToDouble(row[2].ToString()),
Ora01 = Convert.ToDouble(row[3].ToString()),
Ora02 = Convert.ToDouble(row[4].ToString()),
Ora03 = Convert.ToDouble(row[5].ToString()),
Ora04 = Convert.ToDouble(row[6].ToString()),
Ora05 = Convert.ToDouble(row[7].ToString()),
Ora06 = Convert.ToDouble(row[8].ToString()),
Ora07 = Convert.ToDouble(row[9].ToString()),
Ora08 = Convert.ToDouble(row[10].ToString()),
Ora09 = Convert.ToDouble(row[11].ToString()),
Ora10 = Convert.ToDouble(row[12].ToString()),
Ora11 = Convert.ToDouble(row[13].ToString()),
Ora12 = Convert.ToDouble(row[14].ToString()),
Ora13 = Convert.ToDouble(row[15].ToString()),
Ora14 = Convert.ToDouble(row[16].ToString()),
Ora15 = Convert.ToDouble(row[17].ToString()),
Ora16 = Convert.ToDouble(row[18].ToString()),
Ora17 = Convert.ToDouble(row[19].ToString()),
Ora18 = Convert.ToDouble(row[20].ToString()),
Ora19 = Convert.ToDouble(row[21].ToString()),
Ora20 = Convert.ToDouble(row[22].ToString()),
Ora21 = Convert.ToDouble(row[23].ToString()),
Ora22 = Convert.ToDouble(row[24].ToString()),
Ora23 = Convert.ToDouble(row[25].ToString()),
};
Map.Add(mapCollection);
};
}); 
return Map;
}

最新更新