Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何编写接受多个输入的VB线程锁定代码?_.net_Vb.net_Thread Synchronization - Fatal编程技术网

.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秒,然后它将进入临界段
以下作品。它处理多次调用ThreadA_方法1,然后(有时)再调用ThreadA_方法2的情况。 但是有更好的解决办法吗

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)不会提供更好的信息并生成更可靠的代码吗?