Vb.net VB6 DoEvents+Sleep的.NET等效版本

Vb.net VB6 DoEvents+Sleep的.NET等效版本,vb.net,vb6,sleep,doevents,Vb.net,Vb6,Sleep,Doevents,我有一个程序,我正在从VB6更新到VB.NET,用于进行光学测量。硬件运行Win XP或Win 2000 Embedded。在原始代码中,有一个部分在开始使用DoEvents和Sleep的测量后触发: While instDefItf.InstrumentState = Busy Sleep 500 DoEvents Wend 我尝试用一个简单的Threading.Thread.Sleep500替换代码中的中间两行。我意识到这可能是一个糟糕的做法,但我对VB没有太多的经验,我试图尽可能

我有一个程序,我正在从VB6更新到VB.NET,用于进行光学测量。硬件运行Win XP或Win 2000 Embedded。在原始代码中,有一个部分在开始使用DoEvents和Sleep的测量后触发:

While instDefItf.InstrumentState = Busy
  Sleep 500
  DoEvents
Wend
我尝试用一个简单的Threading.Thread.Sleep500替换代码中的中间两行。我意识到这可能是一个糟糕的做法,但我对VB没有太多的经验,我试图尽可能地保留VB6程序。这使得代码在第二次尝试时能够正常工作。在第一次尝试中,本应进行的测量不会发生,但不会抛出错误,后续代码也会正确执行

基于此,我有两个主要问题。首先,是否有什么东西可以简单地替换VB6代码以获得所需的功能?第二,是否有更好的方法定期查询不使用睡眠功能的仪器状态

编辑:

我上面提到的函数是一个辅助函数,我认为这是检查仪器是否完成测量的正确术语。测量例程包含在DLL中,下面给出了执行该例程的代码

If cbMeasLength.Value = vbUnchecked Then
    Call I12001Ref.StartMtj1IlAcquisition2(CLng(lChannel), ConnectorA, m_moduleCollection.ReflectanceModule(lRm).SerialNumber)
End If

' Wait the measurement completion
If cbMeasLength.Value = vbUnchecked Then
    If WaitForOperationCompleted = False Then
        Exit Sub
    End If
End If

我猜你订阅了一些东西,将事件放入你的消息队列错误。。。它是在Win32之前的日子里被调用的吗?这就是为什么你需要DoEvents的原因,它是在同一个线程上处理队列中的所有/一些挂起的消息-现在这种多任务/线程已经很久没有了,也许在一些嵌入式系统上没有,但我怀疑它-所以看看你订阅的是什么类型的事件,只处理那些没有任何睡眠的事件-或者更好:给我们更多细节我有点好奇/感兴趣顺便说一句:在现代VB中,所有UI进程都运行在一个专用线程上,这是一个类似的东西——所以也许你可以通过睡眠来阻止它——常见的替代方法是定时器可以是异步的。在这种情况下,周围有异步睡眠原语。最后:如果你真的想纯粹地使用VB6,仍然有一个周围的原语。请参见上面的编辑。顺便说一句,我尝试使用DoEvents,但没有任何效果。对我来说最奇怪的是,代码在第二次调用时工作正常。您用于与硬件通信的第三方组件是否支持事件,或者必须对其进行轮询?该组件的供应商是否提供.NET或其他版本的SDK?如果您被迫使用ActiveX组件dll进行通信,您是否知道多线程处理是否安全,或者您是否只能在UI线程上使用它?