naif radi Ответов: 2

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


Привет,
Когда я использую фоновый рабочий я получил неясное сообщение '
Cross-thread operation not valid: Control 'Panel4' accessed from a thread other than the thread it was created on.


но если взять рутину на обычную кнопку, то она работает отлично, но я завис во время процесса, а затем после завершения процесса все может быть использовано.

что такое правильный способ, чтобы использовать фоновый поток worker?

Что я уже пробовал:

Private Sub BtnOk_Click(sender As Object, e As EventArgs) Handles BtnOk.Click
        'Try
        If BW.IsBusy = True Then
            If MsgBox("There is a process is running, Do you like to kill the process?", MsgBoxStyle.YesNo + MsgBoxStyle.Information, "Process") = MsgBoxResult.Yes Then
                BW.CancelAsync()
            End If
        Else
            BW.RunWorkerAsync()
        End If

    End Sub


<pre>Private Sub BW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork

        If Not conn.State = ConnectionState.Open Then conn.Open()
        SaveInto.Connection = conn
        SaveInto.CommandText = "DELETE FROM TrialBalance"
        SaveInto.ExecuteNonQuery()

        Select Case Period_Choice
            Case "0" 'Uptodate
                Select Case AllBr_Status
                    Case True
                        Select Case RepType
                            Case "0"
                                Select Case Level_Choice
                                    Case "1"
                                        'سلكت للمستوى الاول كاجماليات بدون تحديد اي فرع
                                        Dim Account_Code, Account_Name As String
                                        Dim Selected_row As Boolean
                                        PB.Maximum = Me.AccountsList.Rows.Count

                                        PB.Visible = True

                                        For Each r1 As DataGridViewRow In Me.AccountsList.Rows
                                            Selected_row = r1.Cells(0).Value
                                            Account_Code = Trim(r1.Cells(1).Value)
                                            Account_Name = Trim(r1.Cells(2).Value)

                                            If Selected_row = True Then
                                                SaveInto.CommandText = "INSERT INTO TrialBalance(Account,Name,OpenBalance) 
                                                            (SELECT Main_Gr_Code,Main_Gr_Name,Sum(ISNULL(OP_BAL_" & Trim(CurYear) & ",0.00))
                                                            FROM Acc_OBAL 
                                                            GROUP BY Main_Gr_Code,Main_Gr_Name
                                                           HAVING Main_Gr_Code = '" & Trim(Account_Code) & "')"
                                                If Not conn.State = ConnectionState.Open Then conn.Open()
                                                SaveInto.ExecuteNonQuery()
                                                SaveInto.CommandText = "Update TrialBalance SET TransactionBalance = 
                                                ISNULL((SELECT SUM(Dr_Acc_Value) - sum(Cr_Acc_Value) As Tot
                                                From JV_QRY
                                                Group By Main_Gr_Code, JV_Year
                                                HAVING Main_Gr_Code = '" & Trim(Account_Code) & "'
                                                And JV_Year = '" & CurYear & "'),0.00)
                                                where Account = '" & Trim(Account_Code) & "'"

                                                If Not conn.State = ConnectionState.Open Then conn.Open()
                                                SaveInto.ExecuteNonQuery()
                                            End If
                                            PB.Value += 1
                                        Next
                                        PB.Visible = False
                                        PB.Value = 0

[no name]

"как правильно использовать Background worker?" - вы имеете в виду, что даже не потрудились провести какое-либо исследование, прежде чем опубликовать это? https://www.codeproject.com/Questions/203749/Background-worker-problem

2 Ответов

Рейтинг:
0

OriginalGriff

Вы можете получить доступ к элементам управления пользовательского интерфейса только из потока, в котором они были созданы, - потока пользовательского интерфейса. Если вы попытаетесь что - то сделать с ними из фонового рабочего процесса - а это другой поток, - вы получите исключение перекрестного потока.

Вместо этого используйте BackgroundWorker.Метод ReportProgress[^] чтобы передать информацию потоку пользовательского интерфейса и позволить ему заниматься обновлениями пользовательского интерфейса.