当前位置: 首页 > 编程语言 > C#

后台线程如何挂起UI线程?如何分享

时间:2023-04-11 11:58:58 C#

后台线程挂UI线程?我正在使用后台线程通过USB初始化仪器。当我尝试打开设备时,UI挂起。我希望后台线程在设备上调用Open时暂停,而不是UI线程。我在没有来自后台线程的UI交互的情况下对此进行测试。我不知道如何调试它,这个问题太宽泛了,但也许有人以前见过这样的东西。据我所知,ActiveX互操作没有任何问题,设备工作正常。这是一般方法:使用系统;使用FancyVoltmeterLibrary;命名空间SOQuestion{publicclassMeterClass{privateFancyVoltmetermeter;私有线程meterThread;publicMeterClass(){//创建ActiveX/COMobject.meter的实例=newFancyVoltmeter();meterThread=新线程(UpdateMeter);meterThread.Name="米线";meterThread.Priority=ThreadPriority.Normal;meterThread.IsBackground=true;meterThread.Start();}privatevoidUpdateMeter(){while(true){Thread.Sleep(1000);if(!meter.IsOpen()){//仪表可能会在此处关闭电源。//调用Open大约需要1秒。//UI在调用过程中挂起???meter.Open();}//读表的代码放在这里。}}}}编辑:也许我不清楚我的意思。通过“悬挂”我应该说“暂时冻结”。仪表是否需要在STA中运行?由于这个原因,对Open()的调用实际上是否被编组回UI线程?您可以通过查看调试器中挂起的UI线程的调用堆栈来验证这是真的。FancyVoltmeter的实例化需要多长时间?导致UI冻结的不是Open方法,而是COM对象的创建(在UI线程上完成)吗?如果事实证明是这种情况,那么将此对象的创建移动到一个新的、单独的工作线程上应该可以解决这个问题。编辑:我现在看到你已经在迈克尔的评论中发现了这一点......我建议你将对meter.open()的调用包装在一个单独的方法中,并在表单或父控件或BeginInvoke()构造上使用Invoke()从updateMeter()方法调用方法。这样做会将操作编组回UI线程,它应该会正常执行。我希望这有帮助。考虑为此任务使用BackgroundWorker。以上就是C#学习教程:后台线程如何挂起UI线程?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: