VB кросс-поток Общий (статический) доступ к элементу - PullRequest
1 голос
/ 04 августа 2010

Я новичок в потоке, пытаюсь научиться этому на ходу. Пожалуйста, не делайте никаких предположений и попытайтесь объяснить концепции и правила потоков, которые могут показаться очевидными.

У меня есть модуль (статический класс) следующим образом:

Модуль Main

Private ReadOnly _dbConn As SqlClient.SqlConnection

Public ReadOnly Property DBConn() As SqlClient.SqlConnection
    Get
        Debug.Print("Accessing DBConn")
        Return _dbConn
    End Get
End Property

Sub New()
    _dbConn = New SqlClient.SqlConnection(My.Resources.ConnectionString)
End Sub

Конечный модуль

Во всем приложении, когда я обращаюсь к DBConn в том же потоке, оно работает как положено. Однако позже я создал фоновый рабочий, который пытается получить доступ к DBConn, и ничего не происходит, поток просто зависает (фоновый рабочий). Я не получаю распечатку, и приложение не продолжается. Фоновый рабочий поток не продолжается после этой точки, поэтому поток никогда не завершается. Я не получаю никаких исключений, и я не могу отладить в Visual Studio (Visual Studio зависает). Я предполагаю, что это вопрос из двух частей: почему я не могу получить доступ к DBConn из другого потока и почему он зависает, не выдавая мне исключение threadAccess? Кроме того, почему Visual Studio зависает (я предполагаю, что он зависает, потому что поток висит)?

Обратите внимание: я не спрашиваю о практике. Я знаю, что мне не следует делить одно и то же соединение, а возвращать новое. В этом конкретном приложении это безопасно, поскольку (хотя я выполняю его в фоновом потоке) согласно потоку приложения, соединение может быть доступно только по одному за раз. Я просто хочу знать, почему он висит на волоске.

1 Ответ

0 голосов
/ 04 августа 2010

Это должен быть класс, а не модуль.Затем вы можете использовать ссылку для передачи соединения в соответствующий поток.

Например:

Private myConn as New NameofDataConnectionClass
Private myWorkerClass as New NameofProcessClass
myWorkerClass.DataConnection = myConn
Private thd as New Threading.Thread(AddressOf myWorkerClass.Method)
thd.Start()

Очевидно, что это кодируется логически, а не конкретно.Суть в том, чтобы создать экземпляр класса соединения и затем передать его соответствующему классу, который обрабатывается потоком или фоновым работником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...