【问题标题】:Error while closing form that is running a BackGround Thread关闭正在运行后台线程的表单时出错
【发布时间】:2016-10-28 10:29:38
【问题描述】:

第一次,我编写了一个运行前台(默认)线程的应用程序:

t = new Thread(new ThreadStart(GenerateRandom));
t.Start();

当我在运行线程时关闭表单时,它会崩溃并抛出异常。 经过一番搜索(How to close all running threads?),我发现一个前台线程在关闭主线程后继续运行,我必须将我的线程设置为后台,所以我做了这样的事情:

t = new Thread(new ThreadStart(GenerateRandom));
t.IsBackground = true;
t.Start();

但它仍然抛出异常并且我在运行我的线程时无法关闭我的表单 !!!

我不知道为什么?!

我在FormClosing event中尝试了一些解决方案:

  1. 使用:Enviroment.Exit(Enviroment.ExitCode);
  2. 使用:thread.Abort();

第一个不起作用,当我在运行线程之前关闭表单时,第二个崩溃。

这是我的程序的一些图片:

图一,结帐前

图2,按下关闭按钮后

谢谢大家。

【问题讨论】:

  • 在您的屏幕截图中的错误是转换错误,这是因为您的文本值是字符串,您可以在测试框值上调用 Trim
  • 想到中止前检查:if (t!= null && t.IsAlive) t.Abort();
  • 构造函数中的小CheckForIllegalCrossThreadCalls = false。什么可能出错?哦等等,这个可能会出错

标签: c# multithreading forms


【解决方案1】:

您是否看到异常消息FormatException。如果你用那个名字搜索你就会明白的。它与您正在运行的线程无关。这是发生的原因,输入的文本不是数字,因此试图将其解析为 Int 失败并出现该异常。

【讨论】:

  • 我认为这个错误是因为 UI 在终止线程之前退出...这是错误的吗?
  • @Parsa,否,如答案中所述,它与是否退出 UI 踏板无关。您应该检查您在textbox3 中输入的内容。这绝对不是一个数字,所以例外。
  • 但是当我选择像 100000 这样的小数字时,它也会崩溃!
【解决方案2】:

通常您运行后台作业直到表单关闭。

类似:

void myThreadJob()
{
   while (!IsDisposed)
   {
      // do my "infinite" task until the form is disposed
   }
}

另一种方法是在表单中添加一个布尔字段。当您的表单关闭时,在FormClosing 事件中将该字段设置为true。然后检查线程代码中while 循环中的布尔字段状态。

【讨论】:

  • 它再次抛出异常! System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的未处理异常附加信息:在执行 CreateHandle() 时无法调用 Value Dispose()。
  • 好的。然后尝试使用第二种方法(布尔字段,并在表单关闭中设置其值以停止线程)
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多