0

我必須在任何表上顯示很多事務。處理需要很長時間。 我想在visual basic 2010中使用後臺進程,但它總是會提供一個類似於「檢測到跨線程操作」的錯誤消息。我嘗試了很多我在互聯網上找到的方式,但仍然無法找到問題所在。 請幫我解決這個問題。 這是我的代碼:使用後臺工作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

我是爲英語不好 – christ2702

+0

'昏暗的工人作爲BackgroundWorker'在DoWork的抱歉..嘗試刪除或使其作爲註釋 – matzone

+0

它給出了同樣的錯誤 – christ2702

回答

0

我想是因爲裏面USP_Select_Registration你試圖讀取從表單控件的值,你會得到錯誤。這是由另一個線程創建的。

RunWorkComleted在創建Backgroundworker的同一個線程中執行,這就是爲什麼代碼P_Panel.Visible = False將正常執行。

但是DoWork在另一個線程上執行。
而當你試圖訪問某些形式的控制讀取值
TXT_Search.Text - 它引發錯誤

你可以通過你的搜索參數BackgroundWorker,但你需要的參數添加到USP_Select_Registration功能。

例如:

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