Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Background Worker, не работает 
:(
    Опции темы
fromrus
Дата 7.5.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



пытаюсь настроить прогрессБар под копирование файлов.Для этого использую BW/вот код класса,где присутствует метод копирования :
Код

class CopyFiles
{
public CopyFiles(){}
public static void Copy(DirectoryInfo source, DirectoryInfo destination)
{
FileInfo[] files = source.GetFiles();
DirectoryInfo[] dirs = source.GetDirectories();
if (!destination.Exists)
{
destination.Create();
}
foreach (FileInfo file in files)
{
file.CopyTo(Path.Combine(destination.FullName,
file.Name), true);
}
// Process subdirectories.
foreach (DirectoryInfo dir in dirs)
{
// Get destination directory.
string destinationDir = Path.Combine(destination.FullName, dir.Name);
// Call CopyDirectory() recursively.
Copy(dir, new DirectoryInfo(destinationDir));
}
}
}

А вот кнопка по которой копируется папка(ну во обще-то она как раз и не копируется):
Код

private void copy_Click(object sender, RoutedEventArgs e)
{
bw = new BackgroundWorker();
CopyFiles cop = new CopyFiles();
bw.RunWorkerAsync(cop); /////////////exeption-с ним все понятно,нулл передаю
}

ну и соответственно события worker'a:
Код

private void bw_DoWork(object sender,DoWorkEventArgs args)
{

CopyFiles.Copy(....);
progBar.Cursor = Cursors.Wait;
bw.ReportProgress(3);
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progBar.Value = e.ProgressPercentage;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progBar.Value = 0;
}

никак не одупляю че передавать в аргумент RunWorkerAsync....Помощи прошу!

Добавлено через 2 минуты и 38 секунд
эт забыл написать..)))) 
Код
bw=sender as BackgroundWorker

Но проблема та же!
PM MAIL ICQ   Вверх
vponomarov
Дата 7.5.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 2
Всего: 12



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


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
fromrus
Дата 8.5.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



надо чтоб файлы копировались в рабочем потоке,а прогресс бар отображал бы этот прогресс.Я не понимаю что передавать в параметр RunWorkerAsync...Если ничего не передавать вылезет тот же ексепшн,что и сейчас
PM MAIL ICQ   Вверх
1stain
Дата 8.5.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



Цитата(fromrus @  8.5.2008,  00:51 Найти цитируемый пост)
надо чтоб файлы копировались в рабочем потоке,а прогресс бар отображал бы этот прогресс.

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

Это сообщение отредактировал(а) 1stain - 8.5.2008, 09:35


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
mr.DUDA
Дата 8.5.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Туда передаётся любой произвольный объект, который потом примет твой метод bw_DoWork через e.Argument. Естесственно, что в bw_DoWork объект приводить нужно явно:
Код
CopyFiles cop = (CopyFiles)e.Argument;



--------------------
user posted image
PM MAIL WWW   Вверх
Ram1reS
Дата 8.5.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 2
Всего: 5



Код


        private void bw_DoWork( object sender , DoWorkEventArgs e )
        {
            // в e.Argument хранится то, что ты передал в RunWorkerAsync
            CopyInfo cInfo = e.Argument as CopyInfo;
            CopyFiles.Copy( cInfo );
        }

        // метод для обновления прогресс бара, написал для примера
        private void bw_ProgressChanged( object sender , ProgressChangedEventArgs e )
        {
            pbProgress.Invoke( (MethodInvoker)delegate()
            {
                pbProgress.Value = e.ProgressPercentage;
            }
            );
        }

        private void btnStart_Click( object sender , EventArgs e )
        {
            CopyInfo cInfo = new CopyInfo();
            cInfo.source = new DirectoryInfo( @"C:\testdir\1" );
            cInfo.dest = new DirectoryInfo( @"C:\testdir\2" );
            // передаем bw информацию о папках
            bw.RunWorkerAsync(cInfo);
        }

        class CopyFiles
        {
            public CopyFiles() { }
            // чуть измененный метод Copy, чтобы принимал 1 параметр
            public static void Copy(CopyInfo cInfo )
            {
                FileInfo[] files = cInfo.source.GetFiles();
                DirectoryInfo[] dirs = cInfo.source.GetDirectories();
                if ( !cInfo.dest.Exists )
                {
                    cInfo.dest.Create();
                }
                foreach ( FileInfo file in files )
                {
                    file.CopyTo( Path.Combine( cInfo.dest.FullName ,
                    file.Name ) , true );
                }
                // Process subdirectories.
                foreach ( DirectoryInfo dir in dirs )
                {
                    // Get destination directory.
                    string destinationDir = Path.Combine( cInfo.dest.FullName , dir.Name );
                    // Call CopyDirectory() recursively.
                    CopyInfo newCopyInfo = new CopyInfo();
                    newCopyInfo.source = dir;
                    newCopyInfo.dest = new DirectoryInfo( destinationDir );
                    Copy( newCopyInfo);
                }
            }
        }

        class CopyInfo
        {
            public CopyInfo()  { }
            public DirectoryInfo source { get; set; }
            public DirectoryInfo dest { get; set; }
        }


Таким образом можно организовать копирование файлов в BackgroundWorker.

Не совсем понятно как Вы собирались обновлять прогрессбар...
Вам надо сначало узнать сколько всего элементов будут копироваться, установить это число в progressBar.Maximum, вести счетчик уже скопированных элементов и этим числом обновлять progressBar.Value (вызовом BackgroundWorker.ReportProgress(FilesCopied)) + у BackgroundWorker должен стоять флажок WorkerReportsProgress.

--------------------
 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.