关闭Form时出现异常(线程+调用)

2023-11-24

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

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

在 Form1_load 上启动新线程:

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

Public void DoThisAllTheTime(不断更新数字):

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

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

'System.Windows.Forms.dll 中发生类型为“System.ObjectDisposeException”的未处理异常

无法更新已删除的对象'

虽然我实际上确实检查了表格是否已处理。

编辑:我将 catch (ObjectDisposeException ex) 添加到解决问题的代码中。 工作代码:

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

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

您致电this.IsDisposed总是过时的。您需要拦截表单关闭事件并显式停止线程。那么你就不必这样做IsDisposed完全测试。

有很多方法可以做到这一点。就我个人而言,我会使用System.Threading.Tasks命名空间,但如果你想继续使用System.Threading,你应该定义一个成员变量_updateThread,并在加载事件中启动它:

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

然后在闭幕活动中:

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

最后,更换IsDisposed测试并检查您的新产品的价值_stopCounting成员变量:

public void DoThisAllTheTime()
{
    MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
    while(!_stopCounting)
    {
        number += 1;
        this.Invoke(yolo);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭Form时出现异常(线程+调用) 的相关文章

随机推荐

  • 达到 MaximumFileSize 时的 log4net 滚动文件附加器文件名格式

    我们使用 log4net 滚动文件附加器 并且对日志文件有以下要求 每天开始时的新日志文件 文件名中包含日期 最大日志文件大小为 500KB 我们遇到的问题是当文件达到 500KB 时的文件命名策略 它们被重命名为 1后缀 这是有问题的 因
  • 以编程方式启用/禁用连接

    在 Windows 7 上 我可以通过网络连接管理器面板 在系统设置中 启用和禁用连接 我如何在 C 中以编程方式执行此操作 谢谢 您可以通过利用 WMI 和 Win32 NetworkAdapter WMI 类在 C 中实现此目的 Win
  • 为什么变异风格被弃用?

    0 13 和 0 14 中的文档都警告说变异样式已被弃用 但没有提及原因 不推荐在渲染之间重用和改变样式对象 如果我想对基于 css 类的动画无法处理的元素执行依赖于状态的动画 我该怎么办 每次都克隆对象 新反应 非常感谢帮助和建议 您可以
  • Python位置,显示距最近其他位置的距离

    我是数据框中的一个位置 位于经纬度列名称下方 我想在单独的数据框中显示距离最近火车站的经纬度有多远 例如 我有一个经纬度 37 814563 144 970267 并且我有一个其他地理空间点的列表如下 我想找到最近的点 然后找到这些点之间的
  • 悬停子元素时如何设置父元素的样式?

    我知道不存在CSS 父选择器 但是在没有这样的选择器的情况下悬停子元素时是否可以设置父元素的样式 举个例子 考虑一个删除按钮悬停时将突出显示即将删除的元素 div p Lorem ipsum p div
  • 为什么 SimpleXML 在使用时将我的数组更改为数组的第一个元素?

    这是我的代码 string lt lt
  • 使用 XSLT 创建带有嵌套粗体/斜体标签的 XSL-FO

    我正在创建 xslt 文件 它将我的 xml 转换为 xsl fo XML 是这样的
  • 如何自动配置 Eclipse?

    从事项目的团队往往需要 Eclipse 的通用配置 这包括通用配置和项目特定配置 例如 一般来说 每个人都可能希望共享缩进 某些插件的安装 例如 m2eclipse testng egit Spring 支持 此外 对于一个项目 您可能需要
  • 为需要另一个扩展的 Python 进行 C 扩展

    我有几个 Python 函数 可以用来让 Pygame 的游戏开发变得更容易 我将它们放在 Python 路径中名为 helper py 的文件中 这样我就可以从我制作的任何游戏中导入它们 我想 作为学习 Python 扩展的练习 将此模块
  • 使用纯云 Azure Active Directory 进行 SQL Azure 集成身份验证失败

    我已经创建了 Azure 租赁并配置了以下内容 Azure AD 具有 简单的自定义域名 少于 15 个字符 DNS 验证等一切都很好 用户和管理员组 两个组中的用户 VNET DNS 和 IP 地址 启用设备管理 启用域服务并连接到 VN
  • Twitter API 在 XAMPP 上返回 NULL

    我正在尝试调用 Twitter API 简而言之 我的问题与描述的相同here 我接到电话NULL on a var dump 结果 However cURL 工作正常 我已经包含了最新版本的twitter api php脚本和所有令牌 密
  • 如何从输入类型文件多个中删除特定文件?

    我正在使用多个输入类型文件来更新一些图片 上传之前 页面会显示每张图片的缩影 我想为每张图片添加一个删除链接 当用户单击时 图片就会消失 文件也会从输入中删除 我尝试使用下面的代码 HTML
  • 理解封装和抽象的简单方法

    学习 OOP 概念特别有兴趣深入理解抽象和封装 已经查看了下面的内容 抽象VS信息隐藏VS封装 抽象和封装之间的区别 我发现如果没有真实且简单的示例类 代码片段 很难理解这些概念 我的一位同事说抽象只不过是创造抽象 类和用范围保护其成员变量
  • 在 Windows Phone 8.1 上获取 CivicAddress

    我正在尝试从 Windows Phone 8 1 中的地理位置获取 CivicAddress 我尝试使用以下代码 Get Current Location var geolocator new Geolocator geolocator D
  • 属性的使用... INotifyPropertyChanged

    这只是我在学习属性时想到的事情 而且我太多地使用了 INotifyPropertyChanged 这只是一个想法 我想听听一些关于它的意见 我知道这需要在编译器上做一些工作 而不是在消费者方面 由于 INotifyPropertyChang
  • 如何在 MySQL 中存储 varbinary?

    只是一个简单的问题 在下面提到的两个选项中 如何存储到varbinaryMySQL 中的列 public key 67498930589635764678356756719 or public key 6749893058963576467
  • 如何为 android MediaController 创建自定义 UI

    我想为我的视频播放器自定义 MediaController 中的控件 我想更换播放按钮的图像 更改皮肤 更改颜色等 有已知的方法可以做到这一点吗 Thanks 我在最近的一个项目中遇到了同样的问题 最终基于库存 MediaControlle
  • “ascii”编解码器无法对位置 9 中的字符 u'\u2013' 进行编码:序号不在范围内(128)

    我正在尝试导入 cvs 但出现此错误 UnicodeEncodeError at brokers csv ascii codec can t encode character u u2013 in position 9 ordinal no
  • 将多个本机 DLL 合并为一个 DLL

    我有很多小的 DLL 我想将它们制作成一个大的 呃 DLL 如在这里建议 我可以通过合并我的项目来做到这一点 但我想要一种侵入性较小的方式 多个DLL可以合并为一个单元吗 快速搜索发现这个线程声称这是不可能的 还有人知道吗 请注意 我谈论的
  • 关闭Form时出现异常(线程+调用)

    我刚刚开始学习c 中的线程和方法调用 但我遇到了一个我找不到解决方案的问题 我制作了一个基本的 C 表单程序 它通过启动线程并调用委托来不断更新和显示数字 在 Form1 load 上启动新线程 private void Form1 Loa