在自己的线程上运行窗口

时间:2018-09-18 14:08:25

标签: c# multithreading

我正在制作一个excel插件,在其中需要很长时间才能创建excel表。因此,我正在其自己的线程上运行进度窗口(Winform),以通知用户正在发生的事情。我想知道我是否正确启动和关闭线程,以及是否可以使用更好的方法来创建任务或其他类似的线程。这是我的代码

 $query->selectRaw('count(*) as count, price - cost_price AS margin')
       ->havingRaw('margin < ?', [$settingValue])
       ->value('count');

1 个答案:

答案 0 :(得分:1)

代码的直接错误在于,您正在使用Thread.Abort通过杀死托管该表单的线程来关闭该表单。

不要那样做!

在某些情况下,Thread.Abort only 选项,而您需要杀死该线程,但是这种方法适用于框架并且异常异常情况。

如果您在设计新代码时应该能够关闭/终止/退出/杀死子任务/线程,请永远不要使用Thread.Abort

请与该任务/线程一起工作,并请它终止,然后任务/线程将自行正确地执行此操作。

那你怎么在这里呢?

关闭表单。

Application.Run中的消息循环代码将正确终止,线程将正常退出。

因此,不要保留对线程的引用,而要保留对表单的引用并执行此操作:

frmPrgBar.Invoke(frmPrgBar.Close);

这是正确的做法,它将使所有有关方面能够有秩序地关闭并终止。

如果您阻止了表单的关闭,则需要添加一种方法来防止在实际关闭表单时,一个简单的bool变量将为您提供帮助。