【发布时间】:2023-04-03 13:50:01
【问题描述】:
在我的应用程序中,数据需要从数据库中加载。在此期间,会显示一个启动画面。我想要一个进度条动画,所以将它添加到启动屏幕 xaml;
<ProgressBar Margin="5" DockPanel.Dock="Top" IsIndeterminate="True" />
这是可行的,但动画基本上会在每次长时间检索数据时停止。我的负载数据看起来像这样;
private void loadData()
{
getData1FromDB();
displayData1_OnScreen();
getData2FromDB();
displayData2_OnScreen();
getData3FromDB();
displayData3_OnScreen();
}
所以当getData1FromDB() 运行时,进度条动画会停止。认为问题可以像这样解决;
private async void loadData()
{
await Task.Run(() => getData1FromDB());
displayData1_OnScreen();
getData2FromDB();
await Task.Run(() => displayData2_OnScreen());
getData3FromDB();
await Task.Run(() => displayData3_OnScreen());
}
这导致了另一个问题。当getData1FromDB() 运行时,程序进入displayData1_OnScreen。由于getData1FromDB() 未完成,因此未显示任何数据。
如何在不重写整个加载过程的情况下解决这个问题?
编辑:基于 cmets;
没有别的东西在打电话给displayData1_OnScreen,老实说我也很惊讶。我唯一能想到的是 loadData() 是从构造函数中调用的。
说实话,不,我不确定这就是问题所在。我正在尝试进行更多调试,以查看@BradleyDotNET 提出后实际发生的情况。
关于getData1FromDB 的问题有点难以解决。基本上它根据参数集构建一个sqlCMD字符串,然后像这样运行它;
DataTable dt = new DataTable();
string ConString = ConnectionString();
using (MySqlConnection con = new MySqlConnection(ConString))
{
MySqlDataAdapter da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(sqlCMD, con);
con.Open();
da.SelectCommand = cmd;
da.Fill(dt);
con.Close();
}
return dt;
【问题讨论】:
-
您发现了第一个问题(UI 被阻止)我很惊讶
displayData1_OnScreen在 await 调用返回之前运行。还有什么叫这个函数吗?你确定这就是问题所在吗? -
这里实际上有两个问题..第二个问题更有趣..而且很难在标题中捕捉到 [both].. 在 SO 上,一口大小更容易处理。跨度>
-
你能发布getData1FromDB代码吗?
标签: c# wpf animation progress-bar async-await