Исключение в методе convert при закрытии формы во время асинхронной задачи - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь визуализировать пузырьковую сортировку следующим образом: у меня есть массив textBoxes arr[], и на каждой итерации я выделяю (изменяя задний цвет на желтый) два элемента этого массива (чтобы показать элементы, которые яЯ работаю сейчас), подождите 1,5 секунды, поменяйте местами (при необходимости), снова подождите, и снова сделайте фоновый цвет белым.Чтобы подождать 1,5 секунды я использую await Task.Delay(1500);.Все работает нормально, кроме случаев, когда я не хочу ждать, пока сортировка не закончится.Когда я нажимаю кнопку закрытия во время сортировки, программа выдает исключение:

Исключение: «System.FormatException» в mscorlib.dll Дополнительная информация: Входная строка была в неправильном формате.**, показывая в строке if (Convert.ToInt32(arr[j].Text) > Convert.ToInt32(arr[j+1].Text))

Но если я дождусь завершения программы, все будет в порядке.

Вот мой код:

async private void button1_Click(object sender, EventArgs e)
    {
        int num = 0;//number of comparisons
        int swap = 0;//number of swaps

        for (int i = 0; i < 10; i++)
        {
            int border = checkBox1.Checked ? (10 - 1 - i) : 9;//if checkBox1.Checked we use advanced bubble sort

            for (int j = 0; j < border; j++)
            {
                arr[j].BackColor = arr[j + 1].BackColor = Color.Yellow;

                num++;
                label3.Text = num.ToString();

                if (Convert.ToInt32(arr[j].Text) > Convert.ToInt32(arr[j+1].Text))
                {
                    label1.Text = arr[j].Text + " is grater than " + arr[j + 1].Text + "\n\nNumbers must \nbe changed";
                    await Task.Delay(1500);

                    swap++;
                    label4.Text = swap.ToString();

                    string temp = arr[j].Text;
                    arr[j].Text = arr[j + 1].Text;
                    arr[j + 1].Text = temp;
                }
                else
                {
                    label1.Text = arr[j].Text + " is smaller \nor equall to " + arr[j + 1].Text + "\n\nNumbers stay";
                }

                await Task.Delay(1500);
                arr[j].BackColor = arr[j + 1].BackColor = Color.White;
                if (checkBox1.Checked) arr[j + 1].BackColor = Color.Cyan;//elements that are already sorted (only in advanced bubble sort)
            }

            if (checkBox1.Checked) arr[0].BackColor = Color.Cyan;
            label1.Text = "Array is now sorted";
        }
    }

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Самым простым исправлением для этого сценария будет проверка, если форма все еще работает после ожидания.Т.е.:

await Task.Delay(1500); if(this.IsDisposed) return;

Однако использование BackgroundWorker и обновление пользовательского интерфейса с помощью обратного вызова ProgressChanged было бы итерацией в направлении лучшего подхода.

0 голосов
/ 26 мая 2018

Это может звучать глупо:

Присвоено ли свойство CancelButton вашей формы кнопке, которой вы перехватили это событие?.

Это единственный способ вызова этого метода, когдазакрытие формы нажатием клавиши ESC.

Остальное

Когда форма закрыта, текстовые поля располагаются, что постепенно устанавливает их строку в textBox.Text = "";

Теперь, если вы сделаете

var value = Convert.ToInt32("");

Тогда вы получите System.FormatException: «Входная строка была в неправильном формате.»исключение.

Лучший способ справиться с этой ситуацией, как сказано в комментариях Амана, иметь токен отмены внутри события закрытия формы и соответствующим образом прервать цикл

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