Почему мой индикатор не отражает статус - PullRequest
0 голосов
/ 02 апреля 2020

Я настроил следующий тест на основе другого проекта, над которым я сейчас работаю, и, похоже, не могу получить индикатор выполнения, отображающий состояние при копировании файлов

BackgroundWorker workerThread = null;

public Form2()
{
    InitializeComponent();

    InstantiateWorkerThread();
}

private void InstantiateWorkerThread()
{
    workerThread = new BackgroundWorker();
    workerThread.ProgressChanged += WorkerThread_ProgressChanged;
    workerThread.DoWork += WorkerThread_DoWork;
    workerThread.WorkerReportsProgress = true;
    workerThread.WorkerSupportsCancellation = true;
}

private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    lblStopWatch.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
    progressBar1.Value = e.ProgressPercentage;
}

private void WorkerThread_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {
        // Report progress to 'UI' thread
        workerThread.ReportProgress(i);
        // Simulate long task
        copytest();
    }
}

private void btnStart_Click(object sender, EventArgs e)
{
    workerThread.RunWorkerAsync();
}

private void copytest()
{
    string pathFrom = @"C:\Test\WA8\CLR";
    string pathTo = @"C:\Test\Test";

    foreach (String file in Directory.GetFiles(pathFrom))
    {
        // Copy the current file to the new path. 
        File.Copy(file, Path.Combine(pathTo, Path.GetFileName(file)), true);
    }
}

Я использую это как для моего примера Я нашел в Интернете

Я также попробовал этот пример с моим кодом и не работает Второй, как попытался

Что я делаю не так с этой настройкой? Копирование работает и занимает около 30 секунд, потому что есть только 50 файлов ..

Первый, как попытка

Моя форма проста, кнопка, индикатор выполнения и метка Simple Form Layout

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

Итак, что-то интересное, я сделал снимок экрана с формой ранее, что означало, что мне пришлось запустить приложение, чтобы показать ярлык на снимке, ну, поскольку я не закрывал приложение во время публикации, я вернулся к нему после моего предыдущего поста и обнаружил, что все обновлено, но не правильно. Все 59 файлов были скопированы, но, хотя копирование уже завершено, индикатор выполнения отображался только частично зеленым цветом, а метка отображала 5%. Почему процесс запускается, завершается и индикатор выполнения отображает только 5% завершения?

Partial update

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Чтобы сообщить о прогрессе, вы должны знать, сколько файлов вы должны скопировать в общей сложности, и сколько файлов было скопировано до сих пор. Для этого вы должны начать с хранения путей, возвращаемых из Directory.GetFiles в переменную:

private void WorkerThread_DoWork(object sender, DoWorkEventArgs e)
{
    const string pathFrom = @"C:\Test\WA8\CLR";
    const string pathTo = @"C:\Test\Test";
    string[] filePaths = Directory.GetFiles(pathFrom);
    for (int i = 0; i < filePaths.Length; i++)
    {
        int currentProgress = (i * 100) / filePaths.Length;
        workerThread.ReportProgress(currentProgress);
        var filePath = filePaths[i];
        var fileName = Path.GetFileName(filePath);
        var newFilePath = Path.Combine(pathTo, fileName);
        File.Copy(filePath, newFilePath, overwrite: true);
    }
    workerThread.ReportProgress(100);
}
0 голосов
/ 02 апреля 2020

Моя текущая версия примера Theodors, которая работает сейчас ..

string[] filestoCopy = Directory.GetFiles(pathFrom);

for (int i = 0; i <= filestoCopy.Length; i++)
{
    int u = (i * 100 / filestoCopy.Length);

    // Report progress to 'UI' thread
    workerThread.ReportProgress(u);
    // Simulate long task
    File.Copy(filestoCopy[i], Path.Combine(pathTo, Path.GetFileName(filestoCopy[i])), true);
}
workerThread.ReportProgress(100);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...