none
не работает событие RunWorkerCompleted в backgroundWorker RRS feed

  • Вопрос

  • подскажите пожалуйста, весь код Form1

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
     
    namespace PrimerPrograms
    {
        public partial class Form1 : Form
        {
            private BackgroundWorker _bw = new BackgroundWorker();
     
            public Form1()
            {
                InitializeComponent();
                _bw.DoWork += _bw_DoWork;
                _bw.ProgressChanged += _bw_ProgressChanged;
                _bw.WorkerSupportsCancellation = true;
                _bw.WorkerReportsProgress = true;
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"от кого";
                var target = @"кому";
                Copy(source, target);
     
                var diSource = new DirectoryInfo(source);
                var files = diSource.GetFiles("*.*", SearchOption.AllDirectories);
                Invoke((Action)delegate
                {
                    progressBar1.Maximum = files.Count();
                    progressBar1.Value = 0;
                });
                //
                foreach (var fileInfo in files)
                {
                    var targetFileINfo = new FileInfo(Path.Combine(target, fileInfo.FullName.Substring(source.Length + 1)));
                    if (!Directory.Exists(targetFileINfo.DirectoryName))
                        Directory.CreateDirectory(targetFileINfo.DirectoryName);
                    fileInfo.CopyTo(targetFileINfo.FullName, true);
                    _bw.ReportProgress(0, targetFileINfo.FullName);
                }
            }
     
            private void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                Invoke((Action)delegate
                {
                    progressBar1.Value++;
                    richTextBox1.AppendText(e.UserState.ToString());
                });
            }
     
            private void _bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("Текст сообщения", "Заголовок сообщения", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
     
            public void Copy(string sourceDirectory, string targetDirectory)
            {
                var diSource = new DirectoryInfo(sourceDirectory);
                var diTarget = new DirectoryInfo(targetDirectory);
                Invoke((Action)delegate
                {
                    progressBar1.Maximum = diSource.GetFiles("*.*", SearchOption.AllDirectories).Length;
                    progressBar1.Value = 0;
                });
                // Вызываем основной метод копирования
                CopyAll(diSource, diTarget);
            }
     
            public void CopyAll(DirectoryInfo source, DirectoryInfo target)
            {
                // Если директория для копирования файлов не существует, то создаем ее
                if (Directory.Exists(target.FullName) == false)
                {
                    Directory.CreateDirectory(target.FullName);
                }
     
                // Копируем все файлы в новую директорию
                foreach (FileInfo fi in source.GetFiles())
                {
                    // Выводим информацию о копировании в консоль
                    Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
                    _bw.ReportProgress(0, string.Format("Copying {0} to {1}\r\n", target.FullName, fi.Name));
                    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
                }
     
                // Копируем рекурсивно все поддиректории
                foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
                {
                    // Создаем новую поддиректорию в директории
                    DirectoryInfo nextTargetSubDir =
                        target.CreateSubdirectory(diSourceSubDir.Name);
                    // Опять вызываем функцию копирования
                    // Рекурсия
                    CopyAll(diSourceSubDir, nextTargetSubDir);
                }
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
        }
    }

    Проблема в том что после окончания копирования файлов информационно окно

     MessageBox.Show("Текст сообщения", "Заголовок сообщения", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

    не выводиться. У меня просто заполняется процесс бар и все.
    И еще одна незначительная деталь... Вот код

    var diSource = new DirectoryInfo(source);
                var files = diSource.GetFiles("*.*", SearchOption.AllDirectories);
                Invoke((Action)delegate
                {
                    progressBar1.Maximum = files.Count();
                    progressBar1.Value = 0;
                });
                //
                foreach (var fileInfo in files)
                {
                    var targetFileINfo = new FileInfo(Path.Combine(target, fileInfo.FullName.Substring(source.Length + 1)));
                    if (!Directory.Exists(targetFileINfo.DirectoryName))
                        Directory.CreateDirectory(targetFileINfo.DirectoryName);
                    fileInfo.CopyTo(targetFileINfo.FullName, true);
                    _bw.ReportProgress(0, targetFileINfo.FullName);
                }
     
    // Копируем все файлы в новую директорию
                foreach (FileInfo fi in source.GetFiles())
                {
                    // Выводим информацию о копировании в консоль
                    Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
                    _bw.ReportProgress(0, string.Format("Copying {0} to {1}\r\n", target.FullName, fi.Name));
                    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
                }

    он выводит каждый путь к файлу в новую строку в richTextBox1 как мне это убрать что бы все осталось работать

    14 апреля 2014 г. 14:15

Ответы

  • 1. Я не вижу у вас в коде подписки на событие RunWorkerCompleted, допишите в конструкторе формы:

    _bw.RunWorkerCompleted += _bw_RunWorkerCompleted;

    2. Удалите из метода _bw_ProgressChanged следущую строку:

    richTextBox1.AppendText(e.UserState.ToString());

    а так же второй параметр из вызова _bw.ReportProgress, т.к. он теперь не используется.

    14 апреля 2014 г. 15:25

Все ответы

  • 1. Я не вижу у вас в коде подписки на событие RunWorkerCompleted, допишите в конструкторе формы:

    _bw.RunWorkerCompleted += _bw_RunWorkerCompleted;

    2. Удалите из метода _bw_ProgressChanged следущую строку:

    richTextBox1.AppendText(e.UserState.ToString());

    а так же второй параметр из вызова _bw.ReportProgress, т.к. он теперь не используется.

    14 апреля 2014 г. 15:25
  • Вот тебе огромное спасибо!!!!

    Но еще не решена небольшая проблема, я копирую примерно 6 тыс файлов...  В этом коде:

     // Выводим информацию о копировании в консоль
                    Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
                    _bw.ReportProgress(0, string.Format("Копирование {0} to {1}\r\n", target.FullName, fi.Name));
                    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
    мне выводиться полная ссылка в копируемому файлу. НО!!!!!!

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

    Вот как выглядит когда происходит копирование

    А вот что получается сразу после копирования (оно просто формирует прямые ссылки к этим же файлам)

    14 апреля 2014 г. 15:55