2010-08-04 6 views
1

저는 스레딩에 초보자이며, 제가 배우는대로 배우려고합니다. 어떤 가정도하지 말고 확실하게 보일 수있는 스레딩 개념과 규칙을 설명하십시오. 내가 동일한 스레드에서 DBConn에 액세스 할 때 VB 크로스 스레드 공유 (정적) 멤버 액세스

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에 액세스하려고 시도한 백그라운드 작업자를 만들었으나 아무 일도 일어나지 않습니다. 스레드가 멈 춥니 다 (백그라운드 작업자). 나는 인쇄물을 얻지 못하고 응용 프로그램이 계속되지 않습니다. 백그라운드 작업자 스레드는 그 지점을 지나서 계속되지 않으므로 스레드가 종료되지 않습니다. 예외가 발생하지 않으며 Visual Studio (Visual Studio 중단)에서 디버깅 할 수 없습니다. 2 가지 질문입니다. 왜 다른 스레드에서 DBConn에 액세스 할 수 없으며 threadAccess 예외를주지 않고 중단됩니까? 또한, 왜 비주얼 스튜디오가 멈 춥니 까 (스레드가 걸려 있기 때문에 멈춘다 고 가정합니다)?

참고 사항 : 나는 연습을 요구하지 않습니다. 같은 연결을 공유해서는 안되며 새로운 연결을 반환해야한다는 것을 알고 있습니다. 이 특정 응용 프로그램에서는 (비록 백그라운드 스레드에서 실행하더라도) 응용 프로그램의 흐름에 따라 안전하므로 연결은 한 번에 하나씩 만 액세스 할 수 있습니다. 난 그냥 왜 스레드에 걸쳐 교수형 알고 싶어요.

답변

0

모듈이 아닌 클래스 여야합니다. 그런 다음 참조를 사용하여 해당 스레드에 연결을 전달할 수 있습니다. 예를 들어

:

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

분명히, 즉하지 특별히 논리적으로 코딩된다. 요점은 연결 클래스를 인스턴스화 한 다음 스레드 또는 백그라운드 작업자가 처리중인 적절한 클래스로 전달하는 것입니다.

+0

모듈은 instaniated 클래스입니다. VB에서는 생성자를 모듈에 작성할 때 정적 생성자이며 모듈의 모든 멤버에 대한 참조가 생성되는 즉시 초기화됩니다. 연결을 호출 할 때까지 정적 생성자가 이미 인스턴스화했습니다. 이것은 연결 멤버가 다른 스레드에 의해 호출되기 전에 액세스된다는 사실에 의해 지원됩니다. NullRefererenceException을 수신하지 않습니다. 문제가 무엇이고 솔루션이 무엇인지 자세히 설명하십시오. – Fragilerus

+0

크로스 스레드를 사용할 때 인스턴스화 된 모듈이 새 스레드로 전달되지 않으므로 개체 참조를 전달해야합니다. 응용 프로그램의 현재 스레드에 남아 있습니다. 따라서 데이터 연결을 래핑하는 클래스의 새 스레드에 객체 참조를 전달해야합니다. – Josaph

+0

나는 그 말이 맞다고 생각하지 않는다. 스레드는 힙 메모리 공간을 공유합니다. 따라서 다른 스레드는 모듈의 동일한 인스턴스에 액세스 할 수 있어야합니다. 나는이 테스트하고 개인 서브 온도() 새로운 System.ComponentModel.BackgroundWorker AddHandler에 bg.DoWork으로 희미한 BG, AddressOf를 변경 bg.RunWorkerAsync() Threading.Thread.Sleep (TimeSpan.FromSeconds를 예상대로 미리 형성 (3)) Console.WriteLine (Module1.Member) End Sub Public Sub (ByVal 보낸 사람 Object, ByVal e DoWorkEventArgs) Module1.Member = "변경됨" End Sub – Fragilerus