2010-11-21 70 views
0

我正在处理一个事件处理代码的项目。基本上,我创建了一个计时器,然后使用我自己的事件处理程序处理超时事件。我通过在那里放置一个断点进行双重检查,是的,事件处理程序确实被添加到该事件中(是的,我也启动了计时器)。但是,出于某种原因,事件处理程序有时会触发,而其他时间则不会。我正在使用多线程,并认为它可能与此有关,但我不确定。事件处理程序有时不会触发C#

我知道这是一个模糊的问题,但希望有人碰到类似的东西。

感谢,

PM

编辑:我看着这个问题远一点,我注意到,这的确是一个线程的问题。负责这个事件的线程是处理我的程序的网络部分的线程,并且它在之后立即被阻塞,因为它正在等待来自网络上另一个程序实例的输入。我将如何解决这个问题?

+0

什么时间有超时事件? – Joey 2010-11-21 23:17:23

+0

完整性检查:你什么时候开始('myTimer.Start()')你的计时器,并且你确定它是在你期望事件触发时开始的? – MPelletier 2010-11-21 23:18:43

+0

@Joey:我想OP的意思是'Elapsed'。 – MPelletier 2010-11-21 23:19:45

回答

2

我已经调查了一下这个问题,我注意到这确实是一个线程问题。负责这个事件的线程是处理我的程序的网络部分的线程,并且它在之后立即被阻塞,因为它正在等待来自网络上另一个程序实例的输入。我将如何解决这个问题?

听起来你的(a)有一个SynchronizingObject集到UI控制一个System.Windows.Timers.Timer,或正在使用(b)一种System.Windows.Forms.Timer。然后,通过网络读取阻止UI线程 - 防止事件触发。

您有2个选项,可以为网络读取或定时器事件使用不同的线程。如果使用System.windows.Timers.Timer,则不要传递SynchronizingObject,并且它会在ThreadPool线程上引发事件。或者,async the network read

+0

问题解决了。我正在使用Windows.Forms.Timer。当我切换到System.Timers.Timer时,一切正常。谢谢! – user472875 2010-11-21 23:37:30

+0

顺便说一句,有没有办法在ThreadPool线程上提出我自己的自定义事件,就像Timer一样,而不是阻塞? – user472875 2010-11-21 23:57:26

+0

@ user472875 - 您可以使用ThreadPool.QueueUserWorkItem并以这种方式提升您的事件。或者,循环遍历每个委托并调用BeginInvoke。 – 2010-11-22 17:04:49

0

它是什么类型的计时器,你有没有参考它?计时器是否有可能在火灾发生前被垃圾收集?在System.Windows.Timers.Timer的文档中有关于此的警告。

+0

我已将GC.KeepAlive添加到两个计时器,但没有结果。我几乎肯定会发生此问题,因为创建计时器的线程会立即执行后面的块。 – user472875 2010-11-21 23:28:36

相关问题