none
работа с потоками с backgroundWorker в C# RRS feed

Ответы

  • public partial class Form1 : Form
        {
            private BackgroundWorker _bw = new BackgroundWorker();
            public Form1()
            {
                InitializeComponent();
                _bw.DoWork += _bw_DoWork;
            }
    
            private void _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"E:\Temp\simplyToPASSTpro - 2012";
                var target = @"E:\Temp\simplyToPASSTpro - 2012 - 2";
                Copy(source, target);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
    
            public void Copy(string sourceDirectory, string targetDirectory)
            {
                var diSource = new DirectoryInfo(sourceDirectory);
                var diTarget = new DirectoryInfo(targetDirectory);
                // Вызываем основной метод копирования
                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);
                    BeginInvoke((Action)(() => textBox1.AppendText(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);
                }
            }
        }

    • Помечено в качестве ответа motokraft 13 апреля 2014 г. 9:07
    • Снята пометка об ответе motokraft 13 апреля 2014 г. 9:07
    • Помечено в качестве ответа motokraft 13 апреля 2014 г. 9:11
    13 апреля 2014 г. 8:44

Все ответы

  • А если поконкретней, что именно нужно?

    Сделаем содержимое сообщества лучше, вместе!

    13 апреля 2014 г. 6:22
    Модератор
  • А если поконкретней, что именно нужно?

    Сделаем содержимое сообщества лучше, вместе!

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

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

    13 апреля 2014 г. 7:14
  • Функцию для копирования папок в студию :)
    13 апреля 2014 г. 8:21
  • Функцию для копирования папок в студию :)

    пожалуйста 

    // Метод копирования: задаем две директории откуда копировать и куда копировать
            public static void Copy(string sourceDirectory, string targetDirectory)
            {
                DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
                DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);
                // Вызываем основной метод копирования
                CopyAll(diSource, diTarget);
            }
    
            public static 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);
                    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
                }
    
                // Копируем рекурсивно все поддиректории
                foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
                {
                    // Создаем новую поддиректорию в директории
                    DirectoryInfo nextTargetSubDir =
                      target.CreateSubdirectory(diSourceSubDir.Name);
                    // Опять вызываем функцию копирования
                    // Рекурсия
                    CopyAll(diSourceSubDir, nextTargetSubDir);
                }
            }
     string sourceDirectory = @"от куда";
     string targetDirectory = @"куда";
    
     Copy(sourceDirectory, targetDirectory);


    13 апреля 2014 г. 8:25
  • public partial class Form1 : Form
        {
            private BackgroundWorker _bw = new BackgroundWorker();
            public Form1()
            {
                InitializeComponent();
                _bw.DoWork += _bw_DoWork;
            }
    
            private void _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"E:\Temp\simplyToPASSTpro - 2012";
                var target = @"E:\Temp\simplyToPASSTpro - 2012 - 2";
                Copy(source, target);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
    
            public void Copy(string sourceDirectory, string targetDirectory)
            {
                var diSource = new DirectoryInfo(sourceDirectory);
                var diTarget = new DirectoryInfo(targetDirectory);
                // Вызываем основной метод копирования
                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);
                    BeginInvoke((Action)(() => textBox1.AppendText(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);
                }
            }
        }

    • Помечено в качестве ответа motokraft 13 апреля 2014 г. 9:07
    • Снята пометка об ответе motokraft 13 апреля 2014 г. 9:07
    • Помечено в качестве ответа motokraft 13 апреля 2014 г. 9:11
    13 апреля 2014 г. 8:44
  • все конечно здорово, Огромное сПасибо.  Но вот в чем проблема, как я и говорил в меня происходит бесконечное копирование, 

    Как после копирования остановить поток?????????????????????

    И еще небольшой вопрос.... 

    параметр _bw_ProgressChanged вывод прогресс выполнения, но как вывести этот прогресс в процесс бар....

    13 апреля 2014 г. 9:11
  • Поток остановится автоматически, как только завершится функция копирования. Останавливать его не надо. Значит проблема в функции копирования или в рекурсии.
    13 апреля 2014 г. 9:14
  • private BacgroundWorker _bw = new BackgrounWorker();

    _bw.WorkerSupportsCancellation = true;
    _bw.WorkerReportsProgress = true;

    Остановка потока
    _bw.CancelAsync();

    Вызов прогресса
    _bw.ReportProgress(<процент выполнения>);
    В обработке события ProgressChanged изменяем ProgressBar в сообтветсвии с данными получеными из <процент выполнения>.


    • Изменено alexkr.net 13 апреля 2014 г. 9:20
    13 апреля 2014 г. 9:19
  • Поток остановится автоматически, как только завершится функция копирования. Останавливать его не надо. Значит проблема в функции копирования или в рекурсии.
    подскажите пожалуйста как вывести прогресс выполнения копирования в процесс бар
    13 апреля 2014 г. 9:21
  • Смотри выше :)
    13 апреля 2014 г. 9:23
  • Смотри выше :)
    а можно подробнее
    13 апреля 2014 г. 9:29
  •  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 _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                Invoke((Action)delegate
                {
                    progressBar1.Value++;
                    textBox1.AppendText(e.UserState.ToString());
                });
            }
    
            private void _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"E:\Temp\simplyToPASSTpro - 2012";
                var target = @"E:\Temp\simplyToPASSTpro - 2012 - 2";
                //
                Copy(source, target);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
    
            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);
                }
            }
        }

    13 апреля 2014 г. 9:42
  • все вроде работает (копирует), но прогресс не выводиться в процесс бар... Выдает ошибку

    13 апреля 2014 г. 9:57
  • Из ошибки следует, что ваша функция копирует больше файлов чем это была задано в начале. Поэтому и ошибка ProgrressBar, так как значение Maximum не может быть меньше Value.

    Выложите исходники, если это возможно. Как я уже говорил, проблема в том, как вы копируите.

    13 апреля 2014 г. 10:08
  • Вы пробовали использовать посланный мною исходный код?
    13 апреля 2014 г. 10:11
  • Из ошибки следует, что ваша функция копирует больше файлов чем это была задано в начале. Поэтому и ошибка ProgrressBar, так как значение Maximum не может быть меньше Value.

    Выложите исходники, если это возможно. Как я уже говорил, проблема в том, как вы копируите.

    у меня всего где то до 6000 файлов в 1320 папок... Вот весь код 

         public Form1()
            {
                InitializeComponent();
                _bw.DoWork += _bw_DoWork;
                _bw.DoWork += _bw_DoWork;
                _bw.ProgressChanged += _bw_ProgressChanged;
                _bw.WorkerSupportsCancellation = true;
                _bw.WorkerReportsProgress = true;
            }
    
            private void _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"D:\Full";
                var target = @"E:\rld-saints4";
                Copy(source, target);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
    
            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 _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                Invoke((Action)delegate
                {
                    progressBar1.Value++;
                    textBox1.AppendText(e.UserState.ToString());
                });
            }
    но я одно скажу, оно так медленно копируется. при обычном копировании с папки в папку так быстро

    13 апреля 2014 г. 10:17
  • Зачем два раза подписываться на событие DoWork?
    13 апреля 2014 г. 10:22
  • Зачем два раза подписываться на событие DoWork?

    сейчас все норм, но все равно выдает ошибку,

    но из за того что все файлы скопированы...

    13 апреля 2014 г. 10:34
  •  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 _bw_DoWork(object sender, DoWorkEventArgs e)
            {
                var source = @"E:\Temp\simplyToPASSTpro - 2012";
                var target = @"E:\Temp\simplyToPASSTpro - 2012 - 2";
    
                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 button1_Click(object sender, EventArgs e)
            {
                _bw.RunWorkerAsync();
            }
    
            private void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                Invoke((Action)delegate
                {
                    progressBar1.Value++;
                    textBox1.AppendText(e.UserState.ToString());
                });
            }
    Попробуй так...
    13 апреля 2014 г. 10:59
  • та же ошибка что и раньше....

    13 апреля 2014 г. 11:05
  • может вся проблема в самом копировании может другой метод выбрать.
    13 апреля 2014 г. 11:12
  • Какая ошибка выходит сейчас? Опять от ProgressBar?
    13 апреля 2014 г. 12:08

  • вот эта же самая ошибка, я даже копирую 12 файлов а не 5000

    я даже пробовал добавить 

     private void _bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if ((e.Cancelled == true))
                {
                    this.tbProgress.Text = "Canceled!";
                }
    
                else if (!(e.Error == null))
                {
                    this.tbProgress.Text = ("Error: " + e.Error.Message);
                }
    
                else
                {
                    this.tbProgress.Text = "Done!";
                }
            }
    ничего не получилось


    • Изменено motokraft 13 апреля 2014 г. 12:15
    13 апреля 2014 г. 12:14