Запускать ProgressBar только во время работы потока - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь увеличить ProgressBar, пока поток выполняет метод getAll () с:

Thread thread = new Thread(new ThreadStart(getAll));
thread.Start();
pbStatus.Visibility = Visibility.Visible;
if (thread.IsAlive)
    pbStatus.Value++;
else 
    pbStatus.Visibility = Visibility.Hidden;

My ProgressBar xaml:

<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />

ProgressBar появляется, если Я запускаю getAll, но не скрываю, если метод завершен.

Я пытался использовать для скрытия настройки индикатора выполнения от thread.isAlive до false, но, похоже, ничего не изменилось.

Моя проблема в том, что я не знаю, как долго работает getAll и сколько я возвращаюсь, чтобы сделать какой-то «прогресс», поэтому я подумал, что это хорошая идея, чтобы проверить, работает ли поток все еще, и просто увеличить мой ProgressBar пока он работает?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вы также можете использовать приведенное ниже решение. Я настоятельно рекомендую использовать Task сверх Thread.

Поток является понятием более низкого уровня: если вы непосредственно запускаете поток, вы знаете, что он будет отдельным потоком, а не выполняется в пуле потоков и т. Д. c.

Задача - это больше, чем просто абстракция «где запустить некоторый код» - на самом деле это просто «обещание результата в будущем».

Так что в целом рекомендуется использовать абстракцию более высокого уровня везде, где это необходимо. возможный.

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
}
0 голосов
/ 10 февраля 2020

Не лучше ли использовать 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;
}

Ваш ProgressBar xaml:

<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...