在异步任务期间关闭表单时转换方法中的异常



我正在尝试通过以下方式可视化气泡排序:我有一个文本框数组arr[],在每次迭代中,我突出显示(通过将背景色更改为黄色(该数组的两个元素(以显示我现在正在使用的元素(,等待 1.5 秒,更改位置(如果需要(,再次等待,然后再次使背景色变白。为了等待 1.5 秒,我使用await Task.Delay(1500);.一切正常,除非我不想等到排序完成。当我在排序过程中单击关闭按钮时,程序会抛出异常:

抛出的异常:mscorlib 中的"System.FormatException".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 + "nnNumbers 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 + "nnNumbers 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";
}
}

提前致谢

这听起来可能很愚蠢:

窗体的 CancelButton 属性是否分配给已挂钩此事件的按钮?。

这是通过按 ESC 键关闭窗体时调用此方法的唯一方法。

当表单关闭时,文本框被释放,逐渐将其字符串设置为 textBox.Text = ";

现在,如果您这样做

var value = Convert.ToInt32("");

然后你会得到System.FormatException:"输入字符串的格式不正确。

处理这种情况的最佳方法,如Aman的评论中所述,在表单关闭事件中有一个取消令牌并相应地打破您的循环

对于这种情况,最简单的解决方法是检查表单在等待后是否仍可操作。 即:

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

但是,使用 BackgroundWorker 并通过 ProgressChanged 回调更新 UI 将是朝着更好方法的迭代。

最新更新