Я работаю над библиотекой классов, которая обеспечит асинхронную связь с приложениями CLR.Почему SyncLock здесь не работает?
В 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 точно так же, как я его использую, с помощью только «Static X как «Новый объект» для создания объекта синхронизации внутри функции, которая должна быть заблокирована.
Это потому, что обратный вызов на самом деле происходит из потока win32 вне .Net framework, который SyncLock здесь не работает?
Является ли метод всегда вызываться на одном объекте или через отдельные объекты этого типа? –
VB.NET не использует «статический», но общий. Также попробуйте переместить объект блокировки вне области действия метода. –
@ AllanS.Hansen Неправильно. VB.NET позволяет использовать модификатор 'Static' для локальных переменных, как это делал VB6. –