C# 仅在线程运行时运行ProgressBar
只要线程正在运行一个名为getAll()的方法,我就会尝试递增ProgressBar,方法如下: 我的ProgressBar xaml:C# 仅在线程运行时运行ProgressBar,c#,wpf,multithreading,C#,Wpf,Multithreading,只要线程正在运行一个名为getAll()的方法,我就会尝试递增ProgressBar,方法如下: 我的ProgressBar xaml: <ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" /> <ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100"
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
如果我启动getAll
,则会显示进度条,但如果方法完成,则不会隐藏进度条
我曾尝试将progressbar设置thread.isAlive
隐藏为false
,但似乎没有任何区别
我的问题是,我不知道运行
getAll
多长时间,也不知道返回多少时间来进行一些“进展”,所以我认为检查线程是否仍在运行是一个好主意,只要它运行,就简单地增加我的ProgressBar
?使用BackgroundWorker不是更好吗?这是您与BackgroundWorker的代码
private void Window_Loaded(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
pbStatus.Visibility = Visibility.Visible;
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
getAll();
//for (int i = 0; i < 100; i++)
//{
// (sender as BackgroundWorker).ReportProgress(i);
// Thread.Sleep(100);
//}
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pbStatus.Visibility = Visibility.Hidden;
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbStatus.Value = e.ProgressPercentage;
}
private void Window\u已加载(对象发送方,路由目标)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=worker\u DoWork;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
worker.ProgressChanged+=worker\u ProgressChanged;
pbStatus.Visibility=可见性.Visibility;
worker.RunWorkerAsync();
}
无效工作线程(对象发送器,工作线程目标)
{
getAll();
//对于(int i=0;i<100;i++)
//{
//(发送方作为后台工作人员)。报告进度(i);
//睡眠(100);
//}
}
void worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
pbStatus.Visibility=Visibility.Hidden;
}
void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
pbStatus.Value=e.ProgressPercentage;
}
您的ProgressBar xaml:
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
使用BackgroundWorker不是更好吗?这是您与BackgroundWorker的代码
private void Window_Loaded(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
pbStatus.Visibility = Visibility.Visible;
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
getAll();
//for (int i = 0; i < 100; i++)
//{
// (sender as BackgroundWorker).ReportProgress(i);
// Thread.Sleep(100);
//}
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pbStatus.Visibility = Visibility.Hidden;
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbStatus.Value = e.ProgressPercentage;
}
private void Window\u已加载(对象发送方,路由目标)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=worker\u DoWork;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
worker.ProgressChanged+=worker\u ProgressChanged;
pbStatus.Visibility=可见性.Visibility;
worker.RunWorkerAsync();
}
无效工作线程(对象发送器,工作线程目标)
{
getAll();
//对于(int i=0;i<100;i++)
//{
//(发送方作为后台工作人员)。报告进度(i);
//睡眠(100);
//}
}
void worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
pbStatus.Visibility=Visibility.Hidden;
}
void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
pbStatus.Value=e.ProgressPercentage;
}
您的ProgressBar xaml:
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
您也可以使用以下解决方案。我强烈建议在
线程
上使用任务
线程是一个较低级别的概念:如果您直接启动一个线程,您知道它将是一个单独的线程,而不是在线程池中执行
这个任务不仅仅是“在哪里运行一些代码”的抽象——它实际上只是“对未来结果的承诺”
因此,一般来说,建议尽可能使用更高级别的抽象
private async void OnSomeEvent(..)
{
pbStatus.IsIndeterminate = true; // maybe show it
var result = await GetAll();
pbStatus.IsIndeterminate = false; // Maybe hide it
// TODO: Do something with result
}
private async Task<Results> GetAll()
{
// some code
}
私有异步void OnSomeEvent(..)
{
pbStatus.ISINDEMINATE=true;//可能会显示它
var result=await GetAll();
pbStatus.IsIndeterminate=false;//可能会隐藏它
//TODO:做一些有结果的事情
}
私有异步任务GetAll()
{
//一些代码
}
您也可以使用以下解决方案。我强烈建议在线程
上使用任务
线程是一个较低级别的概念:如果您直接启动一个线程,您知道它将是一个单独的线程,而不是在线程池中执行
这个任务不仅仅是“在哪里运行一些代码”的抽象——它实际上只是“对未来结果的承诺”
因此,一般来说,建议尽可能使用更高级别的抽象
private async void OnSomeEvent(..)
{
pbStatus.IsIndeterminate = true; // maybe show it
var result = await GetAll();
pbStatus.IsIndeterminate = false; // Maybe hide it
// TODO: Do something with result
}
private async Task<Results> GetAll()
{
// some code
}
私有异步void OnSomeEvent(..)
{
pbStatus.ISINDEMINATE=true;//可能会显示它
var result=await GetAll();
pbStatus.IsIndeterminate=false;//可能会隐藏它
//TODO:做一些有结果的事情
}
私有异步任务GetAll()
{
//一些代码
}
您是否尝试使用BackgroundWorker
?还有,你为什么不使用异步任务
而不是直接使用线程
?你好,我正在使用异步任务
。谢谢您您是否尝试过使用BackgroundWorker
?还有,你为什么不使用异步任务
而不是直接使用线程
?你好,我正在使用异步任务
。非常感谢。