我正在制作一个excel插件,在其中需要很长时间才能创建excel表。因此,我正在其自己的线程上运行进度窗口(Winform),以通知用户正在发生的事情。我想知道我是否正确启动和关闭线程,以及是否可以使用更好的方法来创建任务或其他类似的线程。这是我的代码
$query->selectRaw('count(*) as count, price - cost_price AS margin')
->havingRaw('margin < ?', [$settingValue])
->value('count');
答案 0 :(得分:1)
代码的直接错误在于,您正在使用Thread.Abort
通过杀死托管该表单的线程来关闭该表单。
不要那样做!
在某些情况下,Thread.Abort
是 only 选项,而您需要杀死该线程,但是这种方法适用于框架并且异常异常情况。
如果您在设计新代码时应该能够关闭/终止/退出/杀死子任务/线程,请永远不要使用Thread.Abort
。
请与该任务/线程一起工作,并请它终止,然后任务/线程将自行正确地执行此操作。
那你怎么在这里呢?
关闭表单。
Application.Run
中的消息循环代码将正确终止,线程将正常退出。
因此,不要保留对线程的引用,而要保留对表单的引用并执行此操作:
frmPrgBar.Invoke(frmPrgBar.Close);
这是正确的做法,它将使所有有关方面能够有秩序地关闭并终止。
如果您阻止了表单的关闭,则需要添加一种方法来防止在实际关闭表单时,一个简单的bool
变量将为您提供帮助。