Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Обработичк исключений c#  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3436
fkthat,

какого рукоблудия? Progress<T> : Progress<T> идет из коробки, без всяких рукоблудий.
16 май 19, 20:00    [21886618]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20541
fkthat
Task не умеет репортить прогресс без, хоть и небольшого, но все же рукоблудия (и, кстати, уверен, что дохрена народу себе при этом в ногу выстрелят). А так, да, с таском удобнее.
Ну вроде как для этого Progress<T> есть из коробки....
16 май 19, 20:04    [21886619]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20541
(повтор на втором игроке Картинка с другого сайта.)
16 май 19, 20:04    [21886620]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145645
Супер_Пав
Вы утрируете, говоря про net2. Чем BW устарел?

Нет встроенного механизма работы с несколькими таким потоками. То есть написать такой механизм можно, но зачем, если сейчас есть Таски, где все это реализовано?
16 май 19, 22:09    [21886665]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3436
Cat2,

просто создает N истансов воркера, но он не поддерживает асинхронность вроде, на счет пула потоков не уверен
16 май 19, 22:11    [21886668]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Shocker.Pro
fkthat
Task не умеет репортить прогресс без, хоть и небольшого, но все же рукоблудия (и, кстати, уверен, что дохрена народу себе при этом в ногу выстрелят). А так, да, с таском удобнее.
Ну вроде как для этого Progress<T> есть из коробки....


Хм... Да, действительно. Не знал, не знал. Впрочем, я десктопом не занимаюсь, т.ч. мне оно никогда актуально не было.
16 май 19, 22:18    [21886674]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
Код переименования каталогов ... пытался понять куда запихнуть искл. позволяющие выплеснуть в лист другой формы иям каталога которого не удалось переименовать и продолжать работы for и вот запутался что куда

// Переименование подкаталога
        private void b_rename_Click(object sender, EventArgs e)
        {
            try
            {   
                var rename = MessageBox.Show("Точно переименовать подкаталоги?", "Check_catalogues!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (rename == DialogResult.Yes)
                {

                    for (int j = 0; j < dataGridView1.RowCount; j++)
                    {
                        string priznak = dataGridView1.Rows[j].Cells[3].Value.ToString();
                        if (priznak == "0") // если пустой подкаталог то переименовать
                        {

                            string old_name = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h = old_name.Substring(0, old_name.LastIndexOf('\\'));
                            string new_name = h + "\\" + t_new_name_null.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name, new_name);
                            
                        }

                        if (priznak == "1") // если нет файла в подкаталоге то переименовать
                        {

                            string old_name2 = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h2 = old_name2.Substring(0, old_name2.LastIndexOf('\\'));
                            string new_name2 = h2 + "\\" + t_new_name_err.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name2, new_name2);
                        }
                    }

                    MessageBox.Show(
                       this,
                           "Переименование всех подкаталогов прошло удачно",
                           "Check_catalogues",
                           MessageBoxButtons.OK,
                           MessageBoxIcon.Information
                           );
                }
            }
            catch (Exception)
            {                
                               
            }
                 finally
                    {
                        Form3 f3 = new Form3();
                        f3.listBox1.Items.Add(dataGridView1.Rows[2].Cells[0].Value.ToString() + " - " + "Не удалось переименовать");
                        f3.Show();
                    }
        }
17 май 19, 02:27    [21886744]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
может искл в самом цикле внутри прописать?
17 май 19, 02:34    [21886745]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
SAS2014,
То есть ты сегодня не читая все выше опять запостил свой код.
Прочти топик.
17 май 19, 07:10    [21886782]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
Просто код попросили .... в начале вот и кинул
Вопрос решил ... искл в цикле прописал
Всем спасибо кто отписался по вопросу исключения
17 май 19, 09:09    [21886848]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
Кто то там мне кидал код по остановке backgroundWorker

на половину понял на половину его не понял
можешь мне на моем примере показать как остановить backgroundWorker?
Заранее спс

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                  while (backgroundWorker1.CancellationPending == true)
                  { 
                  //  test_workera.Invoke(new MethodInvoker(() =>test_workera.Text = "1" ));

               
                    //Пустые подкаталоги
                    if (textBox1.Text == "path")
                    {
                        List<string> dirs = Directory.GetDirectories((string)e.Argument, "*", SearchOption.AllDirectories).Where(s => Size(s) == 0).ToList();
                        foreach (string item in dirs)
                        {
                            string[] arr = item.Split(new string[] { @"\" }, StringSplitOptions.None); // отбрасывает пути к пустой папке
                            string it = arr.Last(); // отбрасывает пути к пустой папке
                            dataGridView1.Invoke(new MethodInvoker(() => dataGridView1.Rows.Add((item), ("Пустой"), (it), ("0")))); // добавление найденых пустых каталогов с путями и без путей + 0 пустой подкаталог
                            Thread.Sleep(100); // пауза

                            dataGridView1.Invoke(new MethodInvoker(() => dataGridView1.FirstDisplayedCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]));// авт.прокрутка датагрида
                        }
                    }
               

                    }

                    Invoke(new Action(() =>
                    {
                       // test_workera.Invoke(new MethodInvoker(() => test_workera.Text = "0"));
                       // if (test_workera.Text == "0") { backgroundWorker1.CancelAsync(); }
                        

                        label1.Text = "Выполнено";
                        label1.ForeColor = Color.Green;
                        button1.Enabled = true; // вкл кнопки обзор
                        catalog.Enabled = true;
                        button2.Enabled = true; // вкл кнопки проверить
                       // b_stop_search.Enabled = false;

                        if (dataGridView1.Rows.Count > 0)
                        {
                            button4.Enabled = true; // вкл кнопки сохранить в файл если есть хотя бы один элемент в списке каталогов
                            label4.Visible = true; // отображать надпись кол-во элементов
                            label5.Visible = true; // отображать надпись кол-во элементов
                            label4.Text = dataGridView1.Rows.Count.ToString(); // кол-во подкаталогов
                            button4.Visible = true; // вкл кнопки сохранить в файл (списко найдены пустых каталогов)
                            groupBox1.Visible = true; //отображать панель переимнования

                        }

                        else
                        {
                            button4.Visible = false;
                            MessageBox.Show(
                            this,
                                "В данном каталоге: " + catalog.Text + " нет подкаталогов соотвествующим критериям",
                                "Check_catalogues",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.None
                                );
                        }

                    }));

                  } //Завер цикла проверки потока
                  backgroundWorker1.WorkerSupportsCancellation = true;
                  backgroundWorker1.CancelAsync();
                
                  //e.Cancel = true; 

               // 

            } 
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        
}
17 май 19, 09:11    [21886851]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
Roman Mejtes если ты еще читаешь это топик поможешь с воркером?
17 май 19, 09:13    [21886854]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
SAS2014
Member

Откуда: Сталинград
Сообщений: 2786
stomsky
SAS2014
Есть просто код ... который пробегает по datagridview определенного столбца, в котором список полного пути к конченому подкаталогу

Круто ты описал процесс. Я аж только с третьего прочтения догадался о чем речь )))

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

Я правильно догадался: у тебя есть функция, в которой есть цикл, в котором выполняется перебор путей и выполнение некоторых действий по этим путям (переименование файлов или каталогов)? И, если внутри цикла вылетает исключение (exception), то происходит вылет из цикла и перебор всех путей прерывается?

Что-то вроде этого:
void MyFunction(string[] pathArray)
{
  foreach(string path in pathArray)
  {
    // здесь происходит переименование и может вылететь exception
  }
}


Если я прав, попробуй модифицировать код примерно так:
void MyFunction(string[] pathArray)
{
  foreach(string path in pathArray)
  try
  {
    // здесь происходит переименование и может вылететь exception
  }
  catch(Exception ex)
  {
    list1.Items.Add(path); // отображение проблемного пути
    MessageBox.Show(ex.Message); // вывод сообщения об ошибке для диагностики проблемы
  }
}


Ну или приведи фрагмент своего кода, чтобы говорить более конкретно.

SAS2014
PS И еще вопрос ... кто нибудь скинет рабочий код, который позволяет при нажатие на кнопке "стоп" останавливать
BackgroundWorker

Более опытные коллеги меня поправят, но, по-моему, остановить работу BackgroundWorker можно только тогда, когда BackgroundWorker в своем DoWork проверяет не пришла ли команда на прерываниие выполнения. Если в DoWork такой проверки не выполнять, то остановить BackgroundWorker штатно нельзя. Тебя именно такой вариант интересует?


Спасибо за направление на верный путь по решению вопроса ... свой текст закинул в топик выше
17 май 19, 09:14    [21886856]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
SAS2014,
Зачем вокер?
17 май 19, 09:39    [21886878]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
SAS2014
пробегает по datagridview
воркер не нужен.
17 май 19, 09:41    [21886881]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 149
Т.е. ты хочешь в случае возникновения Exception-а создать новую форму, в которую выведешь список каталогов/файлов, которые не удалось переименовать? Тогда предлагаю:
1) конечно перехват исключения внести внутрь цикла переименований
2) в обработчике накапливать список каталогов/файлов, которые не удалось переименовать
3) после выхода из цикла собственно проверить есть ли в списке из п.2 хотя бы один элемент, и если есть, то создать форму и вывести в нее содержимое этого списка

Типа такого (добавленные мной строки оканчиваются комментарием " // <--"):
// Переименование подкаталога
        private void b_rename_Click(object sender, EventArgs e)
        {
            List<string> problems = new List<string>(); // <--
            try
            {   
                var rename = MessageBox.Show("Точно переименовать подкаталоги?", "Check_catalogues!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (rename == DialogResult.Yes)
                {
                    for (int j = 0; j < dataGridView1.RowCount; j++)
                    [b]try[/b]
                    {
                        string priznak = dataGridView1.Rows[j].Cells[3].Value.ToString();
                        if (priznak == "0") // если пустой подкаталог то переименовать
                        {

                            string old_name = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h = old_name.Substring(0, old_name.LastIndexOf('\\'));
                            string new_name = h + "\\" + t_new_name_null.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name, new_name);
                            
                        }

                        if (priznak == "1") // если нет файла в подкаталоге то переименовать
                        {

                            string old_name2 = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h2 = old_name2.Substring(0, old_name2.LastIndexOf('\\'));
                            string new_name2 = h2 + "\\" + t_new_name_err.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name2, new_name2);
                        }
                    }
                    catch(Exception ex) // <--
                    { // <--
                        problems.Add(dataGridView1.Rows[j].Cells[0].Value.ToString();); // <--
                    } // <--
                    if (problems.Count == 0)  // <--
                      MessageBox.Show(
                         this,
                             "Переименование всех подкаталогов прошло удачно",
                             "Check_catalogues",
                             MessageBoxButtons.OK,
                             MessageBoxIcon.Information
                             );
                    else // <--
                    { // <--
                        Form3 f3 = new Form3(); // <--
                        foreach (strint problem in problems) // <--
                           f3.listBox1.Items.Add(problem + " - " + "Не     удалось переименовать"); // <--
                        f3.Show(); // <--
                    } // <--
                }
            }
            catch (Exception)
            {                
                               
            }
        }


PS. Не в обиду, просто любопытно: судя по вопросу, ты недавно начал C# изучать?
17 май 19, 09:52    [21886899]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 149
Petro123
SAS2014
пробегает по datagridview
воркер не нужен.

Вероятно, список очень длинный, поэтому наблюдается подвисание интерфейса.
ТС расчитывает, что применение BW проблему с подвисанием решит...
Но то, что данные тянутся непосредственно из datagridview меня несколько смущает...
Я лично предпочитаю в таких случаях по источнику данные ходить, а не по контролу, отображающему данные...
Но что-то мне подсказывает, что ТС либо студент, либо любитель-энтузиаст (в хорошем смысле), либо недавно за C# взялся...
17 май 19, 09:56    [21886905]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
fkthat
Member

Откуда:
Сообщений: 1163
stomsky
Но то, что данные тянутся непосредственно из datagridview меня несколько смущает...


Да. Это днище.
17 май 19, 10:08    [21886924]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
stomsky,
Да. Он должен разбить задачу на две не пересекающихся даже в форуме.
17 май 19, 10:12    [21886929]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
stomsky
Вероятно, список очень длинный,
нет. Имхо удаляемые папки с подпапками большие. Но кто знает реально. Может препод задал))
17 май 19, 10:13    [21886931]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 149
Ну и так, до кучи, предлагаю вот это:
                        if (priznak == "0") // если пустой подкаталог то переименовать
                        {

                            string old_name = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h = old_name.Substring(0, old_name.LastIndexOf('\\'));
                            string new_name = h + "\\" + t_new_name_null.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name, new_name);
                        }

                        if (priznak == "1") // если нет файла в подкаталоге то переименовать
                        {
                            string old_name2 = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h2 = old_name2.Substring(0, old_name2.LastIndexOf('\\'));
                            string new_name2 = h2 + "\\" + t_new_name_err.Text + dataGridView1.Rows[j].Cells[2].Value.ToString();
                            System.IO.Directory.Move(old_name2, new_name2);
                        }

заменить на:
                        if (priznak == "0") // если пустой подкаталог то переименовать
                        {
                            string old_name = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h = System.IO.Path.GetDirectoryName(old_name);
                            string new_name = System.IO.Path.Combine(
                                    h, 
                                    t_new_name_null.Text,
                                    dataGridView1.Rows[j].Cells[2].Value.ToString());
                            System.IO.Directory.Move(old_name, new_name);
                            
                        }
                        if (priznak == "1") // если нет файла в подкаталоге то переименовать
                        {
                            string old_name2 = dataGridView1.Rows[j].Cells[0].Value.ToString();
                            string h2 = System.IO.Path.GetDirectoryName(old_name2);
                            string new_name2 = System.IO.Path.Combine(
                                    h2,
                                    t_new_name_err.Text,
                                    dataGridView1.Rows[j].Cells[2].Value.ToString());
                            System.IO.Directory.Move(old_name2, new_name2);
                        }


А если в самом начале файла воткнуть:
using System.IO.Path;

то далее по тексту этот самый "System.IO.Path" можно будет опускать.
Код компактнее будет.
17 май 19, 10:27    [21886944]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 149
stomsky
А если в самом начале файла воткнуть:
using System.IO.Path;


Сорри, должно быть конечно:
using System.IO;

И тогда можно будет опустить по тексту это: "System.IO".
От упоминания класса "Path" по коду не избавишься )
17 май 19, 10:30    [21886951]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2053
stomsky
От упоминания класса "Path" по коду не избавишься )

Ну почему...

using static System.IO.Path;
17 май 19, 10:33    [21886956]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
fkthat
Member

Откуда:
Сообщений: 1163
stomsky
От упоминания класса "Path" по коду не избавишься )


using static System.IO.Path;


Поддерживается аж с шестой версии шарпа. Но, имхо, такой абьюз языка - это уже даже не днище, а "с днища постучали" (с)
17 май 19, 10:38    [21886965]     Ответить | Цитировать Сообщить модератору
 Re: Обработичк исключений c#  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Дмитрий Мух,

"Гонки первонахов"
17 май 19, 10:39    [21886971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить