Как я отображаю прогресс во время занятого цикла?

if((testItem & FlagTest.Flag1) == FlagTest.Flag1) 
{
...
}
10
задан ASh 6 October 2018 в 10:08
поделиться

3 ответа

Переместите работу в BackgroundWorker и используйте метод ReportProgress .

for (i = 0; i < count; i++)
{
    ... do analysis ...
    worker.ReportProgress((100 * i) / count);
}

private void MyWorker_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    taskProgressBar.Value = Math.Min(e.ProgressPercentage, 100);
}
11
ответ дан 3 December 2019 в 22:01
поделиться
    //Create a Delegate to update your status button
    delegate void StringParameterDelegate(string value);
    String countLabel = "/" + count.ToString();
    //When your button is clicked to process the loops, start a thread for process the loops
    public void StartProcessingButtonClick(object sender, EventArgs e)
    {
        Thread queryRunningThread = new Thread(new ThreadStart(ProcessLoop));
        queryRunningThread.Name = "ProcessLoop";
        queryRunningThread.IsBackground = true;
        queryRunningThread.Start();
    }

    private void ProcessLoop()
    {
        for (i = 0; i < count; i++)
        {
            ... do analysis ...
            UpdateProgressLabel("Step "+i.ToString()+countLabel);
        }
    }

    void UpdateProgressLabel(string value)
    {
        if (InvokeRequired)
        {
            // We're not in the UI thread, so we need to call BeginInvoke
            BeginInvoke(new StringParameterDelegate(UpdateProgressLabel), new object[] { value });
            return;
        }
        // Must be on the UI thread if we've got this far
        labelProgress.Content = value;
    }
3
ответ дан 3 December 2019 в 22:01
поделиться

Пользовательский интерфейс не обновляется из-за того, что ваш текущий поток имеет более высокий приоритет, чем ваш поток пользовательского интерфейса, который в конечном итоге установит метку;). Так что, пока ваш поток не завершит работу с вашими материалами, он будет обновлять вашу метку в конце.

К счастью для нас, в каждом элементе управления WPF есть свойство Dispatcher, которое позволяет запускать новый поток с другим приоритетом ..

labelProgress.Dispatcher.Invoke(DispatcherPriority.Background,
                    () => labelProgress.Content = string.Format("Step {0}{1}", i, countLabel));

Это запустит поток в фоновом режиме и выполнит свою работу! Вы также можете попробовать другие параметры DispatcherPriority

PS Я также позволил себе добавить анонимный метод и несколько поправить синтаксический анализ вашей строки ... надеюсь, вы не против ..

2
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: