C# TextReader()被计时器_Tick()和#x2B;这是主动控制吗?

C# TextReader()被计时器_Tick()和#x2B;这是主动控制吗?,c#,timer,crash,controls,textreader,C#,Timer,Crash,Controls,Textreader,我有一个子表单,它有一个文本阅读器,可以在被调用时加载一些值。我一召唤表单,它就一直在崩溃。此表单有一个计时器,可通过以下方式更新文本框的文本: textbox.Text = this.ActiveControl.Name; 我注意到在加载操作期间禁用计时器可以阻止崩溃的发生。我说文本阅读器受到this.ActiveControl的干扰并导致崩溃,对吗 VS即时计时器调试器每次都会发出不同的[xxxx]错误代码。尝试使用VS进行调试会得到“无法附加崩溃进程。已附加调试程序。”可能存在争用条件:

我有一个子表单,它有一个
文本阅读器
,可以在被调用时加载一些值。我一召唤表单,它就一直在崩溃。此表单有一个
计时器
,可通过以下方式更新
文本框的文本:

textbox.Text = this.ActiveControl.Name;
我注意到在加载操作期间禁用计时器可以阻止崩溃的发生。我说
文本阅读器
受到
this.ActiveControl
的干扰并导致崩溃,对吗


VS即时计时器调试器每次都会发出不同的[xxxx]错误代码。尝试使用VS进行调试会得到“无法附加崩溃进程。已附加调试程序。”

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

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

textbox.Text = this.ActiveControl.Name;
if(this.ActiveControl!=null) {tbTest.Text=this.ActiveControl.Name;}

即使我没有禁用计时器,也不会再发生崩溃。卡布姆,汉斯搞错了^^


感谢阿提拉给了我比赛状态的指针。在知识工具箱中非常有用。

可以提供一些代码吗?这是一个WinForms计时器?你有什么例外?在事件处理程序中放置断点并逐步调试。ActiveControl可以为null。卡布姆。不发布异常详细信息对我们没有帮助。格罗,这确实是一个Windows.Forms.Timer.Attila,我认为你是对的。在Form_Load()中,我在调用TextReader()方法之前禁用计时器,然后在调用完成后重新启用它。再也没有撞车了。以前,我做了同样的事情,但在我的TextReader()方法中。我是C#的新手,所以像“竞态条件”之类的东西对我来说并不新鲜。@hoangnguyen-竞态条件不是C#独有的——你必须在任何可以模拟执行的环境(例如线程)中处理它们。表单初始化和计时器在不同的线程中运行,因此您必须小心如何在这两个线程之间协调对相同内容的访问我想timer_Tick()是一个接近(但不是)的答案。当ActiveControl为null时,表单崩溃,但我的代码试图从中提取名称。因此,禁用计时器会给代码一些时间来分配ActiveControl。