PIC*_*ain 5 .net c# com multithreading
我正在使用.NET framework 3.5版在C#.NET上开展一个项目.
我的项目有一个名为Focuser.cs的类,它代表一个物理设备,一个望远镜聚焦器,可以通过串行(RS-232)端口与PC通信.我的类(Focuser)具有CurrentPosition,CurrentTemperature等属性,它们代表聚焦器的当前条件,它可以随时改变.因此,我的Focuser类需要不断轮询设备以获取这些值并更新其内部字段.我的问题是,执行此连续轮询序列的最佳方法是什么?有时,用户需要将设备切换到不同的模式,这需要能够停止轮询,执行某些操作,然后恢复轮询.
我的第一次尝试是使用每500ms滴答一次的时间,然后调出一个背景工作者,该工作人员轮询一个位置然后返回一个温度.当计时器勾选后台工作人员是忙碌时,它只会返回并在500毫秒后再次尝试.有人建议我一起摆脱背景工作者,只是在计时器刻度事件中进行轮询.因此,我将计时器的AutoReset属性设置为false,然后每次轮询完成时重新启动计时器.这两种技术似乎在我的应用程序中表现完全相同,所以我不确定一个是否优于另一个.每次我想使用新的ThreadStart进行轮询操作时,我也尝试创建一个新线程.这似乎也很好.
我应该提一件事.此类是COM对象服务器的一部分,这基本上意味着将通过COM调用生成的类库.我不确定这是否对答案有任何影响,但我只是认为我应该把它扔出去.
我问这一切的原因是我的所有测试工具运行和调试版本工作得很好但是当我做一个发布版本并尝试从另一个应用程序调用我的类时,该应用程序冻结并且我有一个很难确定原因.
任何建议,建议,意见将不胜感激.
谢谢,乔丹
请记住,计时器隐藏了自己的后台工作线程,该线程基本上在时间间隔内休眠,然后触发其 Elapsed 事件。知道了这一点,将轮询放在 Elapsed 中就有意义了。在我看来,这将是最佳实践,而不是从线程启动线程。您也可以启动和停止计时器,因此切换模式的代码可以 Stop() 计时器,执行任务,然后再次 Start() 计时器,并且计时器甚至不必知道望远镜 IsBusy。
但是,我要跟踪的是 Elapsed 事件处理程序的另一个实例是否仍在运行。您可以锁定 Elapsed 处理程序的代码,或者可以设置一个从任何线程可见的标志,指示另一个 Elapsed() 事件处理程序仍在工作;看到此标志设置的已用事件处理程序可以立即退出,从而避免使用串行端口时出现并发问题。