.net 如何编写接受多个输入的VB线程锁定代码?
我读了很多关于锁定机制的资料,但我仍然没有答案如何写一个:.net 如何编写接受多个输入的VB线程锁定代码?,.net,vb.net,thread-synchronization,.net,Vb.net,Thread Synchronization,我读了很多关于锁定机制的资料,但我仍然没有答案如何写一个: 接受的入口多于出口 第二个线程将等待最长5秒,然后它将进入临界段 以下作品。它处理多次调用ThreadA_方法1,然后(有时)再调用ThreadA_方法2的情况。 但是有更好的解决办法吗 Private _lock as Boolean Private Sub ThreadA_Method1 Handles _otherDll.BeforeAction _lock = True ' A - Critical section
- 接受的入口多于出口
- 第二个线程将等待最长5秒,然后它将进入临界段
Private _lock as Boolean
Private Sub ThreadA_Method1 Handles _otherDll.BeforeAction
_lock = True
' A - Critical section code 1
' ...
End Sub
Private Sub ThreadA_Method2 Handles _otherDll.AfterAction
Try
' A - Critical section code 2
' ...
Finally
_lock = False
End Try
End Sub
Private Sub ThreadB_Method
Dim stopWatch As Stopwatch = New Stopwatch()
stopWatch.Start()
While _lock AndAlso stopWatch.ElapsedMilliseconds < 5000
Thread.Sleep(100)
End While
stopWatch.Stop()
' B - Critical section code
' ...
End Sub
Private\u锁定为布尔值
私有子线程a_Method1处理_otherDll.BeforeAction
_lock=True
'A-临界截面代码1
' ...
端接头
私有子线程a_Method2处理_otherDll.AfterAction
尝试
'A-临界段代码2
' ...
最后
_锁=假
结束尝试
端接头
私有子线程b_方法
将秒表调暗为秒表=新秒表()
秒表开始
而_lockand also stopWatch.elapsed毫秒<5000
线程。睡眠(100)
结束时
秒表
'B-临界截面代码
' ...
端接头
对于\u lock
,我建议使用系统.Threading.ManualResetEvent
代替布尔值
(请参阅)。然后可以使用WaitOne
方法更有效地暂停
Private _lock As New ManualResetEvent(False)
Private Sub ThreadA_Method1() Handles _otherDll.BeforeAction
_lock.Reset()
' A - Critical section code 1
' ...
End Sub
Private Sub ThreadA_Method2() Handles _otherDll.AfterAction
Try
' A - Critical section code 2
' ...
Finally
_lock.Set()
End Try
End Sub
Private Sub ThreadB_Method()
_lock.WaitOne(5000)
' B - Critical section code
' ...
End Sub
你将要犯下非常严重的错误,这将使你的生活在接下来的6个月里痛苦不堪。你需要读一本关于线程的书,你猜不出需要什么。汉斯·帕桑(Hans Passant)可能是正确的,你正在走向痛苦。因此,我为仓促的回答道歉。但是,您能否提供更多关于_otherDll所代表的处理类型的详细信息?在我看来,它看起来像是与数据采集设备(如指纹读取器、气象站等)通信的编码模式。感谢您查看它,也感谢您预测6个月的痛苦=P。我将尝试解释我的应用程序,但我不确定它是否能让事情变得清楚。。。我的应用程序的目的是测试另一个应用程序。它在目标应用程序上运行100000个测试(脚本)。目标应用程序有时显示对话框,另一个DLL:DialogCapturer处理它们。单击按钮之前调用ThreadA_方法1,单击按钮之后调用ThreadA_方法2。我可以期待,但我不能保证这些电话之间的关系是1:1。。。。ThreadA_Method2只记录对话框处理的信息。如果此对话框很关键,并且目标应用程序已关闭,则另一个API将通知ThreadB_方法。。。ThreadB_方法记录“CriticalError”并关闭测试。只有有时ThreadA_Method2没有时间记录“对话”消息。这就是我想要解决的问题。我真的不希望有6个月的痛苦。问题是我是否会在log:Dialog+Error中出现错误,还是只有错误。在我的代码中,如果没有ThreadA\u Method1调用,ThreadB\u方法不需要等待。所以我相信构造函数应该是新的ManualResetEvent(True)。我说的对吗?是的,在这种情况下,使用新的ManualResetEvent(True)(与_lock.Set()相同)。顺便问一下,您对二进制(真/假)信号真正满意吗?某种枚举信号(例如ThreadA_NOP、ThreadA_Method1_Start、ThreadA_Method1_End、ThreadA_Method2_Start、ThreadA_Method2_End)不会提供更好的信息并生成更可靠的代码吗?