0

모든 테이블에 많은 트랜잭션을 표시해야합니다. 처리하는 데 오랜 시간이 걸립니다. Visual Basic 2010에서 백그라운드 프로세스를 사용하려고하지만 "크로스 스레드 작업 감지 됨"과 같은 오류 메시지가 항상 나타납니다. 나는 인터넷에서 발견 한 여러 가지 방법을 시도해 왔지만 여전히 문제가 무엇인지 찾을 수 없습니다. 이 문제를 해결하는 방법에 대해 도움을주십시오. 내가 USP_Select_Registration의 내부는 양식 컨트롤의 값을 읽으려고하기 때문에이 오류가 생각백그라운드 작업자 VB.NET

Private Sub CHK_A_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CHK_A.CheckedChanged 
     Disabled() 
     P_Panel.Visible = True 
     B_Worker.RunWorkerAsync() 

    End Sub 

Private Sub BTN_Search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Search.Click 

     USP_Select_Registration() 
    End Sub 

    Private Sub B_Worker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles B_Worker.DoWork 

     Threading.Thread.Sleep(25) 
     USP_Select_Registration() 

    End Sub 

    Private Sub B_Worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles B_Worker.RunWorkerCompleted 
     P_Panel.Visible = False 
    End Sub 

이 사람이 내 가게 절차

Public Sub USP_Select_Registration() 
     Dim Con As New SqlConnection(SQLCon) 
     Try 
      Con.Open() 
      Dim Cmd As New SqlCommand("USP_Select_Registration", Con) 
      Cmd.CommandType = CommandType.StoredProcedure 
      Cmd.Parameters.Add("@Check", SqlDbType.Bit).Value = CHK_A.EditValue 
      Cmd.Parameters.Add("@Month", SqlDbType.Int).Value = CBO_Month.SelectedIndex + 1 
      Cmd.Parameters.Add("@Year", SqlDbType.Int).Value = SPE_Year.EditValue 
      Cmd.Parameters.Add("@Search", SqlDbType.VarChar, 150).Value = TXT_Search.Text 
      DS_Registration.Tables("MST_Registration").Clear() 
      Dim Adt As New SqlDataAdapter(Cmd) 
      Adt.Fill(DS_Registration.Tables("MST_Registration")) 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Critical, "Error") 
     Finally 
      Con.Close() 
     End Try 
    End Sub 
+0

내가 dowork에서 BackgroundWorker'으로 나쁜 영어 – christ2702

+0

'희미한 노동자에 대 한 미안 해요 해당 개체를 전달 .. 제거하거나 btn_search_click에 동일 할 시도 – matzone

+0

로 만들려고. .. – christ2702

답변

0

입니다 : 이 내 코드입니다. 다른 스레드가 만든 것입니다.

RunWorkComletedBackgroundworker이 작성된 동일한 스레드에서 실행되므로 코드 P_Panel.Visible = False이 정상적으로 실행됩니다.

그러나 DoWork은 다른 스레드에서 실행됩니다. 이 오류를 당신은 BackgroundWorker에 매개 변수를 검색 전달할 수

인상,하지만 당신은 USP_Select_Registration 함수에 매개 변수를 추가 할 필요가 - 일부 양식에 액세스하려고 할 때
그리고 값
TXT_Search.Text을 읽을 것. 예를 들어

:

Private Sub USP_Select_Registration(searchText as String) 
    'Your code here 
End Sub 

은 그럼 당신은 BackgroundWorker을 시작 :는 경우

B_Worker.RunWorkerAsync(TXT_Search.Text) 

그리고

Private Sub B_Worker_DoWork(ByVal sender As Object, 
          ByVal e As DoWorkEventArgs) Handles B_Worker.DoWork 

    Threading.Thread.Sleep(25) 
    USP_Select_Registration(e.Argument) 

End Sub 

당신이 두 개 이상의 매개 변수를 전달해야합니다.
그래서 구조체/클래스 또는 필요한 모든 값을 유지할 수있는 객체를 만들 수 있습니다. 그리고 RunWorkerAsync

관련 문제