KGr28 Ответов: 2

Как загрузить прогресс в то же время мой метод работает


У меня есть давно работающий метод , поэтому я создал индикатор выполнения, чтобы показать, какой процент мой метод должен был завершить, но мне трудно понять, как это сделать, так как мой индикатор выполнения с моим методом => эксельхелпер.InsertNewRows();.

Что я уже пробовал:

Код:

public void ButtonSubmit_Click(object sender, EventArgs e)
    {
        if (isProcessRunning)
        {
            MessageBox.Show("A Process is aleady running");
            return;
        }


        Thread backgroundThread = new Thread(
            new ThreadStart(() =>
            {
                for (int n = 0; n < 100; n++)
                {

                    isProcessRunning = true;
                    Thread.Sleep(50);
                    progressBar1.Invoke(
                        new Action(() =>
                        {
                            progressBar1.Value = n;
                            label3.Text = ("Progress: " + n+ "%");

                        }

                     ));
                }
                MessageBox.Show("Thread completed!");
                progressBar1.Invoke(
                    new Action(() =>
                    {
                        progressBar1.Value = 0;

                    }
                    ));
                isProcessRunning = false;

            }
            ));
        backgroundThread.Start();
        excelHelper.InsertNewRows();
        var folder = TextOutputFile.Text + @"\" +
        DateTime.Now.ToString("yyyy_MM_dd_") + "SA_Analysis_Report.xlsx";
        excelHelper.Save(folder);
        MessageBox.Show("File has been added to file");
    }

2 Ответов

Рейтинг:
12

Richard Deeming

Если вы хотите, чтобы индикатор выполнения соответствовал прогрессу вашего метода, вам нужно будет обновить свой метод, чтобы сообщить о его прогрессе. Используйте IProgress<T> интерфейс и то Progress<T> класс для управления коммуникацией.

IProgress<T> интерфейс (система) | Microsoft Docs[^]
Прогресс<T> класс (система) | Microsoft Docs[^]

Если вы хотите, чтобы ваш пользовательский интерфейс обновлялся во время выполнения метода, вам нужно будет запустить его в фоновом потоке. Напр.:

public void ButtonSubmit_Click(object sender, EventArgs e)
{
    SubmitAsync();
}

private async Task SubmitAsync()
{
    if (isProcessRunning)
    {
        MessageBox.Show("A Process is aleady running");
        return;
    }
    
    var progress = new Progress<int>(n =>
    {
        progressBar1.Value = n;
        label3.Text = ("Progress: " + n+ "%");
    });
    
    string outputFile = TextOutputFile.Text;
    
    isProcessRunning = true;
    
    await Task.Run(() =>
    {
        excelHelper.InsertNewRows(progress);
        
        string fileName = Path.Combine(outputFile, DateTime.Now.ToString("yyyy_MM_dd_") + "SA_Analysis_Report.xlsx");
        excelHelper.Save(fileName);
    });
    
    MessageBox.Show("File has been added to file");
    progressBar1.Value = 0;
    isProcessRunning = false;
}
NB: В обратного вызова, переданной в Progress<T> класс автоматически вызывается через SynchronizationContext захватывается при создании экземпляра. Вам не нужно беспокоиться об использовании Invoke чтобы обновить пользовательский интерфейс в обратном вызове.


Рейтинг:
0

Richard MacCutchan

Я не уверен, в чем заключается ваша реальная проблема, но есть много примеров того, как использовать ProgressBars, которые можно найти по адресу c - поиск в Google[^]


KGr28

Мой вопрос таков:

У меня есть давно работающий метод, поэтому я создал индикатор выполнения, чтобы показать ,какой процент мой метод должен был завершить, но мне трудно понять, как это сделать, синхронизируя мой индикатор выполнения с моим методом => excelHelper.InsertNewRows();.
В основном мой индикатор выполнения показывает, как долго должна работать функция.

Richard MacCutchan

Перейдите по ссылке выше; в первом пункте даже есть пример кода, который вам нужен.

KGr28

Проблема не в том чтобы заставить progressbar работать а в том чтобы он работал синхронно с моей функцией так что:

Что я хочу, чтобы он сделал:

Когда я нажимаю на кнопку submit , я хочу, чтобы она запускала как мою ProgressBar, так и метод одновременно, progressBar должен отслеживать время, необходимое моему методу для завершения от 0% до 100% .

Что он делает:
Когда я нажимаю на кнопку ButtonSubmit_Click, она попадает в мой поток с моим кодом для моего progressBar , игнорирует его, а затем статрирует мой метод, не загружая мой progressbar


Ссылка, которую вы предоставили, не показывает, как это сделать.

Richard MacCutchan

Вот статья CodeProject с полным исходным кодом: Демонстрация BackgroundWorker и ProgressBar[^].