Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在线程运行时运行ProgressBar_C#_Wpf_Multithreading - Fatal编程技术网

C# 仅在线程运行时运行ProgressBar

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"

只要线程正在运行一个名为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" 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
?还有,你为什么不使用
异步任务
而不是直接使用
线程
?你好,我正在使用
异步任务
。非常感谢。