我正在开发一个类库,它将为 CLR 应用程序提供异步通信。
SslStream 上存在异步读取 (BeginRead),具有多个流共享的单个回调例程。我不希望在调试期间并行处理回调,所以我创建了一个关键部分:
Private Sub Callback_Read(ByVal ar As IAsyncResult)
Static OneAtATime As New Object
SyncLock OneAtATime
Dim ThisSslStream As SslStream = DirectCast(ar.AsyncState, SslStream)
...
End SyncLock
End Sub
令我惊讶的是,这不起作用,至少当我在 SyncLock 块中设置断点时不起作用。多个流的回调同时在其中运行,无需在入口点等待前一个线程离开它。
单步执行是一场噩梦,尤其是当流同时被关闭(关闭)时:为流 1 执行行,为流 2 执行行,为 1 执行下一行,为 2 执行下一行,依此类推,贯穿整个堵塞。
我想也许你需要的不仅仅是一个通用的“新对象”,但后来我看到这里至少有一个关于堆栈溢出的答案,它说明了 SyncLock 正是我使用它的方式,只有“静态 X 作为新对象”在必须锁定的函数中创建同步对象。
是不是因为回调实际上来自 .Net 框架之外的 win32 线程,所以 SyncLock 在这里不起作用?