如何获取以和谐方式运行的多个Threading.Timer实例

时间:2018-10-25 17:24:12

标签: vb.net multithreading

嗨,我对运行多个threading.timers的应用程序遇到的难题感到非常痛苦,

'Instaniate the timer to refresh the memory cache of pi points (tags)
_tagRefreshTimer = New Threading.Timer(New Threading.TimerCallback(AddressOf TagRefresh), Nothing, Timeout.Infinite, Timeout.Infinite)
'Instaniate the timer to check for new files to process
_fileCheckTimer = New Threading.Timer(New Threading.TimerCallback(AddressOf FileCheck), Nothing, Timeout.Infinite, Timeout.Infinite)
'Instaniate the timer to check for dynamic setting changes
_settingsTimer = New Threading.Timer(New Threading.TimerCallback(AddressOf SettingsRefresh), Nothing, Timeout.Infinite, Timeout.Infinite)

每个计时器可以配置为以不同的时间间隔运行:

_tagRefreshTimer.Change(_tagRefreshInterval, _tagRefreshInterval)
_settingsTimer.Change(_settingsRefreshInterval, _settingsRefreshInterval)
_fileCheckTimer.Change(_fileCheckInterval, _fileCheckInterval)

我希望这些计时器由于在单独的线程中运行,因此可以彼此并行地幸福地运行;然而,事实证明事实并非如此。发生的情况是,三个中的两个将一起运行,但是由于某种原因,第三个没有机会解雇。如果我在代码中添加了一个断点,并等待了几秒钟,然后继续,那么第三个代码有时会触发,但是仅在那个时候触发,然后它消失在后台。

我想知道这里是否存在某种竞争条件,尽管我不得不说,正如起初提到的那样,因为threading.timers在其自己的线程中运行,并且在这种情况下不以主线程,我根本没想到这个问题。任何人都知道这里发生了什么以及我该如何规避?

1 个答案:

答案 0 :(得分:0)

好的,我将问题归结为我试图在某些条件下从竞争性回调中使用'Timeout.Infinite'暂停三个不同的计时器中的每个计时器。例如,在进行标签刷新时,我想暂停文件检查过程,直到标签刷新完成为止,反之亦然。看起来,即使一旦完成任务,每个计时器都重新打开,也有一些妨碍计时器发挥预期作用的原因。现在已经清理了代码,所有计时器均按预期触发,并且回调按预期完成。 App现在可以正常运行,因此请考虑以下查询。再次感谢您的输入:-)

亲切问候 保罗。