【问题标题】:TextReader() crashed by Timer_Tick() + this.ActiveControl?TextReader() 被 Timer_Tick() + this.ActiveControl 崩溃?
【发布时间】:2012-06-18 17:14:12
【问题描述】:

我有一个子表单,它有一个 TextReader 在被调用时加载一些值。我召唤表格的那一刻,它一直在崩溃。此表单有一个Timer,它以这种方式更新TextBox 的文本:

textbox.Text = this.ActiveControl.Name;

我注意到在加载操作期间禁用计时器会阻止崩溃的发生。我可以说TextReaderthis.ActiveControl 干扰并导致崩溃吗?

VS Just-in-Timer 调试器每次都会给出不同的 [xxxx] 错误代码。尝试使用 VS 进行调试得到“无法附加崩溃进程。已附加调试器。”

【问题讨论】:

  • 可以提供一些代码吗?
  • 这是一个 WinForms 计时器?你得到什么例外?在您的事件处理程序中放置一个断点并逐步调试它。
  • ActiveControl 可以为空。卡布姆。不发布异常详细信息对我们没有帮助。
  • 咕噜,确实是一个Windows.Forms.Timer。

标签: c# timer crash controls textreader


【解决方案1】:

您很可能遇到了竞争条件:如果在调用计时器(并尝试访问它)时ActiveControl 尚未初始化,您将遇到崩溃。正如您提到的,您需要确保计时器在完全初始化之前不会访问无效的ActiveControl(通过在此之前禁用它或通过其他方式(例如互斥锁/信号量)保护访问)

【讨论】:

  • 阿提拉,我认为你是对的。在 Form_Load() 中,我在调用 TextReader() 方法之前禁用了 Timer,然后在它完成后重新启用它。没有更多的崩溃。以前,我做了同样的事情,但在我的 TextReader() 方法中。我是 C# 新手,所以诸如“竞争条件”之类的东西对我来说并不新鲜。
  • @hoangnguyen - 竞争条件不是 C# 独有的 - 对于任何可以模拟执行的环境(例如线程),您都必须处理它们。表单初始化和计时器在单独的线程中运行,因此您必须小心如何协调两者之间对相同事物的访问
【解决方案2】:

感谢大家的帮助。我忽略了汉斯·帕桑特的回答。现在,当我以这种方式将 TextBox 文本更新嵌套在 if 中时:

如果 (this.ActiveControl != null) { tbTest.Text = this.ActiveControl.Name; }

即使我没有禁用计时器,也不会再发生崩溃。 Kaboom,汉斯指出了错误! ^^

感谢 Attila 给了我关于比赛条件的指针。在知识工具箱中非常有用。

【讨论】:

  • 我猜 Timer_Tick() 是一个接近(但不是)的答案。当 ActiveControl 为空时表单崩溃,但我的代码尝试从中提取名称。所以禁用计时器会给代码一些时间来分配 ActiveControl。
猜你喜欢
  • 2012-02-27
  • 2012-08-05
  • 1970-01-01
  • 2011-08-29
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多