所以在我的简单程序中,我有一个进度条和一个按钮。
现在这个按钮将从我的数据库中读取 2 个表(mysql
例如)。
只需 2 个简单的选择语句即可读取 2 个不同的表。
我的问题是
如何实现进度条,以便在读取/选择第一个表后,进度条值将重置为 0 并继续读取下一个表并再次增加进度条?
此功能在安装某些应用程序时非常相似,其中要复制的每个文件都有单独的进度,但只使用一个进度条。
如果您能提供示例,那将很有帮助。
如果您也可以提供背景工作者,那就更好了
所以在我的简单程序中,我有一个进度条和一个按钮。
现在这个按钮将从我的数据库中读取 2 个表(mysql
例如)。
只需 2 个简单的选择语句即可读取 2 个不同的表。
我的问题是
如何实现进度条,以便在读取/选择第一个表后,进度条值将重置为 0 并继续读取下一个表并再次增加进度条?
此功能在安装某些应用程序时非常相似,其中要复制的每个文件都有单独的进度,但只使用一个进度条。
如果您能提供示例,那将很有帮助。
如果您也可以提供背景工作者,那就更好了
1)。读取数据库时,您不知道将收到多少条目才能获得确切的进度。因此,您需要来自 SQL 服务器的这些信息。请阅读SQL Server 的报告进度。
2)。BackgroundWorker
DEV N00B 的评论中很好地解释了如何使用。要执行两个查询,我将为每个查询创建一个具有自己的 DoWork 函数的单独工作程序,并以这种方式调用它们
private void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Value = 0;
Thread.Sleep(1000);
if (worker2.IsBusy != true)
{
worker2.RunWorkerAsync();
}
}
你会有一个想法:如果你有问题,请告诉我。
async private void Button_Click_1(object sender, RoutedEventArgs e)
{
await Task.Factory.StartNew(ExecuteSQL1);
UpdateProgressBar(0);
await Task.Factory.StartNew(ExecuteSQL2);
UpdateProgressBar(0);
}
private void ExecuteSQL1()
{
for (int i = 0; i < 100; i++)
{
int progressBarValue = i;
Task.Factory.StartNew(() => UpdateProgressBar(progressBarValue), CancellationToken.None, TaskCreationOptions.None, uiScheduler);
Thread.Sleep(50);
}
}
private void ExecuteSQL2()
{
for (int i = 0; i < 100; i++)
{
int progressBarValue = i;
Task.Factory.StartNew(() => UpdateProgressBar(progressBarValue), CancellationToken.None, TaskCreationOptions.None, uiScheduler);
Thread.Sleep(100);
}
}
TaskScheduler uiScheduler;
public MainWindow()
{
InitializeComponent();
uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
}