在 VB.NET 中设置手动超时
Setting a manual timeout in VB.NET
我有一个 vb.net 应用程序,它与一些外部硬件接口 - 一系列电机控制器。为此,我使用了硬件供应商提供的 CANOpen 库。然而,库中内置的超时设置实在是太过分了,会导致应用程序在特定条件下痛苦地挂起。如果可能的话,我希望不需要编辑库。
在 vb.net 内设计另一个更短的超时最明智的方法是什么?所讨论的函数是一个阻塞函数,因此线程内计时器可能无济于事。这里有优雅的解决方案吗?
试一试,这是迄今为止我能想到的最好的方法。我使用后台工作者只是因为它们易于使用。
基本上它是一个线程中的一个线程,它至少可以让您的 UI 保持响应,根据您所说的判断,您应该为所有驱动器通信功能使用线程,以防驱动器丢失通信出于任何原因,当应用处于 运行.
时
这不是很漂亮,但它至少可以让您在 CAN 函数本身超时之前提前退出。
Private connected As Boolean
Private Sub bwTryConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwTryConnect.DoWork
Dim timeout As Boolean
Dim timeoutCount As Integer
Dim timeoutValue As Integer = 5 ' timeout value
bwConnect.RunWorkerAsync() ' start worker to try connection
While bwConnect.IsBusy And Not timeout
Thread.Sleep(1000) ' wait a second
timeoutCount += 1 ' increment timeout value
If timeoutCount = timeoutValue Then timeout = True ' connection timed out
End While
' connected will be true if the try connection worker completed (connection to drive ok) before the timeout flag was set, otherwise false
connected = Not timeout
End Sub
Private Sub bwConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwConnect.DoWork
' use your CAN library function here - either a simple connect command or just try reading an arbitary value from the drive
' if you want to test this, uncomment one of the following lines:
'Thread.Sleep(20000) ' simulate timeout
'Thread.Sleep(2000) ' simulate connect
End Sub
很明显,您随后调用 bwTryConnect.RunWorkerAsync()
。
我有一个 vb.net 应用程序,它与一些外部硬件接口 - 一系列电机控制器。为此,我使用了硬件供应商提供的 CANOpen 库。然而,库中内置的超时设置实在是太过分了,会导致应用程序在特定条件下痛苦地挂起。如果可能的话,我希望不需要编辑库。
在 vb.net 内设计另一个更短的超时最明智的方法是什么?所讨论的函数是一个阻塞函数,因此线程内计时器可能无济于事。这里有优雅的解决方案吗?
试一试,这是迄今为止我能想到的最好的方法。我使用后台工作者只是因为它们易于使用。
基本上它是一个线程中的一个线程,它至少可以让您的 UI 保持响应,根据您所说的判断,您应该为所有驱动器通信功能使用线程,以防驱动器丢失通信出于任何原因,当应用处于 运行.
时这不是很漂亮,但它至少可以让您在 CAN 函数本身超时之前提前退出。
Private connected As Boolean
Private Sub bwTryConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwTryConnect.DoWork
Dim timeout As Boolean
Dim timeoutCount As Integer
Dim timeoutValue As Integer = 5 ' timeout value
bwConnect.RunWorkerAsync() ' start worker to try connection
While bwConnect.IsBusy And Not timeout
Thread.Sleep(1000) ' wait a second
timeoutCount += 1 ' increment timeout value
If timeoutCount = timeoutValue Then timeout = True ' connection timed out
End While
' connected will be true if the try connection worker completed (connection to drive ok) before the timeout flag was set, otherwise false
connected = Not timeout
End Sub
Private Sub bwConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwConnect.DoWork
' use your CAN library function here - either a simple connect command or just try reading an arbitary value from the drive
' if you want to test this, uncomment one of the following lines:
'Thread.Sleep(20000) ' simulate timeout
'Thread.Sleep(2000) ' simulate connect
End Sub
很明显,您随后调用 bwTryConnect.RunWorkerAsync()
。