【问题标题】:Occasional thread abort exception偶尔的线程中止异常
【发布时间】:2018-02-06 12:17:31
【问题描述】:

我从以前的开发人员那里继承了一些代码,应用程序在执行特定任务时偶尔会出现线程中止异常。

    private void popup()
    {

        Thread th = new Thread(() =>
        {
            try
            {
                OpenForm();
            }
            catch (ThreadAbortException ex)
            {
                Console.WriteLine("Thread was forcibly aborted");
            }
        });

        th.Start();
        while (fromflag)
        {
        }

        th.Abort();

    }

线程打开一个带有动画加载 gif 的弹出窗口,从服务器下载文件,然后完成。完成后我将 fromflag 设置为 false。 我无法设置计时器,因为下载文件可能需要任何时间。

如何以不同的方式编写它,这样我就不必使用 th.Abort 并且线程在完成时会自行关闭?

【问题讨论】:

  • 为什么你觉得你现在需要Abort 电话?
  • 我想知道这是如何“偶尔”发生的,因为您每次都强制中止线程。
  • 该代码有很多 WTF,从令人担忧的繁忙等待循环,到在后台线程中创建令人讨厌的表单,再到对Thread.Abort() 的彻头彻尾的攻击性调用。我敢打赌fromflag 也没有被声明为volatile(不应该这样——应该重写代码以避免完全出现繁忙的循环)。无论如何:应该为表单本身提供一种知道何时关闭自身的方法,而不是使用Thread.Abort()
  • 我认为“扔掉它,从头开始”真的是最好的方法!

标签: c# .net multithreading threadabortexception thread-abort


【解决方案1】:

您要在 anotehr 线程上打开表单?这是一些非常糟糕的设计。

通常所有表单都应该由 GUI 线程创建。如果 anotehr 线程需要写一些东西,那就是 Invoke

如果不向我们展示在线程中运行的实际代码(大概包含在 OpenForm() 中),我们根本无法帮助您进行调试。

虽然我可以理解程序员为什么使用这个快捷方式(根据 Dispaly 技术,做空闲动画可能需要额外的线程),但我仍然认为这是一个糟糕的设计,应该重新设计。

【讨论】:

  • /agree 有比这更好的方法来显示“进行中”等待对话框。
  • 那么问题的答案是什么?这应该是一条评论。
  • 答案:重新设计它,这样你就不需要调用 Thread.Abort() 来关闭你的表单了。
猜你喜欢
  • 2010-12-23
  • 2011-04-15
  • 2012-05-17
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2012-01-21
相关资源
最近更新 更多