Csharp/C#教程:System.Windows.Forms.Timer没有触发分享


System.Windows.Forms.Timer没有触发

我想使用System.Windows.Forms.Timer来确保在我正在创建的excel插件的UI线程上触发事件。 我按如下方式构建计时器:

 private System.Windows.Forms.Timer _timer; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Debug.WriteLine("ThisAddIn_Startup:" + Thread.CurrentThread.ManagedThreadId); _timer = new System.Windows.Forms.Timer(); _timer.Tick += new EventHandler(TimerEventHandler); _timer.Interval = 500; } 

计时器由我正在使用的库中的COM事件触发:

 private void OnEvent() { _timer.Start(); } 

然后我希望_timer_timer时调用以下方法:

 public void TimerEventHandler(object sender, EventArgs args) { _timer.Stop(); Debug.WriteLine("Tick: " + Thread.CurrentThread.ManagedThreadId); } 

据我所知,当我在Addin线程中创建计时器时,即使它是从另一个线程启动的(在这种情况下是COM事件),它应该触发它创建的线程,即插件线程。 但是,这不会发生。

我已经在我过去编写的RTDServer实现了这个确切的机制( 如Kenny Kerr所述 ),并且它按预期工作,但此场景中的_timer永远不会_timer

我还阅读了其他SO文章指出相同的行为,无法弄清楚我的插件设置有什么不同?

编辑:触发OnEvent()方法。

我最初的意思是发布这个评论,但它变得太长了。

首先,你的线程结构对我来说有点混乱,就像你描述的那样。 将Debug.WriteLine("OnEvent:" + Thread.CurrentThread.ManagedThreadId)放在OnEvent ,让我们知道您从调试输出中看到的所有线程ID。

那说,规则是:

在我看来,@ Maarten的答案实际上提出了正确的做法。

winforms计时器是一个控件,必须通过将其放在表单上来使用。 你永远不会把它添加到控件集合中,所以我不希望它能正常工作。 文档说明如下

实现以用户定义的间隔引发事件的计时器。 此计时器已针对Windows窗体应用程序进行了优化,必须在窗口中使用。

因此,我建议您使用System.Timers.Timer类的实例。 这个类可以在任何地方使用。

请注意,上面使用的Tick事件由System.Timer.Timer类中的另一个名称调用,即Elapsed-event 。

我还不明白为什么Forms.Timer没有按预期运行,但下面的优秀文章详细解释了如何将工作编组到UI线程: http : //www.codeproject.com/Articles/31971/Understanding-的SynchronizationContext-部分-I

上述就是C#学习教程:System.Windows.Forms.Timer没有触发分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1013996.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐