当前位置: 首页 > 知识库问答 >
问题:

关闭Form时的异常(线程调用)

谭宏盛
2023-03-14

我刚刚开始学习c#中的线程和方法调用,但我遇到了一个无法解决的问题。

我做了一个基本的C#表单程序,通过启动一个线程和调用委托,不断更新和显示一个数字。

在Form1_load开始新的线程:

private void Form1_Load(object sender, EventArgs e)
  {
        t = new System.Threading.Thread(DoThisAllTheTime);
        t.Start();
  }

Public void始终显示此消息(该消息会不断更新号码):

public void DoThisAllTheTime()
  {
     while(true)
      {
        if (!this.IsDisposed)
         {
           number += 1;
           MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
           this.Invoke(yolo);
         }
      }
  }

现在,当我单击表单的X按钮时,出现以下异常:

类型System的未处理异常。发生在System.窗户。Forms.dll

无法更新已删除对象的

虽然我确实检查了表格是否被处理了。

编辑:我在修复问题的代码中添加了cat(ObjectDisposedExc0019 ex)。工作代码:

  public void DoThisAllTheTime()
  {
     while(true)
      {
         number += 1;

         try {  
              MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
              this.Invoke(yolo);
             }
         catch (ObjectDisposedException ex)
             {
              t.Abort();
             }
      }
 }

共有3个答案

袁山
2023-03-14
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Thread.CurrentThread.Abort();
}
轩辕修能
2023-03-14

只需将此重写放在表单类中:

protected override void OnClosing(CancelEventArgs e) {
    t.Abort();
    base.OnClosing(e);
}
陆飞鸿
2023-03-14

您对的调用将执行此操作。IsDisposed总是过时。您需要截获表单关闭事件并显式停止线程。这样你就根本不必做IsDisposed测试了。

有很多方法可以做到这一点。就我个人而言,我会使用系统。穿线。任务命名空间,但如果您想继续使用系统。线程,您应该定义一个成员变量\u updateThread,并在加载事件中启动它:

_updateThread = new System.Threading.Thread(DoThisAllTheTime);
_updateThread.Start();

然后在你的闭幕式中:

private void Form1_Closing(object sender, CancelEventArgs e)
{
    _stopCounting = true;
    _updateThread.Join();
}

最后,将IsDisposed测试替换为检查新\u stopCounting成员变量的值:

public void DoThisAllTheTime()
{
    MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
    while(!_stopCounting)
    {
        number += 1;
        this.Invoke(yolo);
    }
}
 类似资料:
  • 问题内容: 我目前在关闭应用程序的CTRL-C期间关闭异步协程时遇到问题。下面的代码是我现在所拥有的简化版本: 如果按CTRL-C,会给我以下输出: 我对asyncio的经验不是很丰富,所以我很确定我在这里缺少重要的东西。真正让我头疼的是输出之后的部分。从开始,我必须承认我不知道发生了什么。我查看了其他问题,但无法正常工作。那么,为什么这段代码输出类似的东西?如何干净地关闭协程呢? 谢谢你的帮助!

  • 在将基础设施从JEE6迁移到Jee7之后,我在Quartz调度器中得到了一个“resultset is closed”异常。 是:9.0.0.10 DB2:v11.1.4.4 DB2 JDBC:11.1.3_4.22.38(与11.1.4.4的行为相同) jpa:hibernate-jpa-2.1-api:1.0.2.final JTA:1.2 Spring:5.1.4 Hibernate:5.2

  • 问题内容: 我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便可以输出以指示脚本仍在运行。 我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这没关系;但是,使用以下代码不起作用: 在线程类本身中,我尝试重新抛出异常,但是它不起作用。我已经看到这里的人问类似的问题,但是他们似乎都在做比我想做的事情更具体的事情(

  • 问题内容: 下面的代码尝试做到这一点。 该代码将永远循环并检查是否有任何待处理的请求要处理。如果存在,它将创建一个新线程来处理请求并将其提交给执行者。一旦所有线程完成,它将休眠60秒,然后再次检查未决请求。 我的问题是这些线程完成的大多数处理都是针对数据库的。该程序将在Windows计算机上运行。当有人尝试关闭或注销计算机时,这些线程会发生什么?如何正常关闭正在运行的线程以及执行程序? 问题答案:

  • 问题内容: 我有一个Python程序,当我使用退出应用程序时 ,脚本不会关闭。我的过程仍显示在运行的过程中。 为什么python线程不能关闭? 问题答案: 您需要将该线程设为守护程序线程。为此,请在调用线程的init之后添加以下行 当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护程序的

  • 从终端执行jar时,我得到以下信息: 我搜索了他的错误,发现了一些相同的执行输出错误,但没有解决我的情况。 下面详细介绍了文件的位置、清单内容、所采取的终端步骤以及所涉及的两个类文件的代码内容。 文件位置 > SWT库 舱单 班级 普通人。jar(参见下面的创建): Manifest.txt内容: 终端动作 > 目录更改 . jar创建 舱单检查 普通人。jar执行 密码 用户nterface.c