在VB.Net WPF中使用Back Ground worker

时间:2014-06-13 16:20:18

标签: wpf vb.net multithreading event-dispatch-thread

我是WPF和整个线程格式的新手。我很确定我接近正确,但是,我收到了错误。 “调用线程无法访问此对象,因为另一个线程拥有它。”我之前收到此错误,我不得不添加“Dispatcher.BeginInvoke(Sub()LoadLoad())”行,但我仍然收到错误。当我收到错误时,它会在LoadLoad()子方法中突出显示“Dim dc = New VSCSystemEntities1”行。任何帮助,将不胜感激。感谢。

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    InitialLoad()

End Sub

Private Sub InitialLoad()

    Try

        loadPayeeTransactionAccounts()

        bw.WorkerSupportsCancellation = True
        bw.WorkerReportsProgress = True
        AddHandler bw.DoWork, AddressOf bw_DoWork
        AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
        AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted

    Catch ex As Exception
        MessageBox.Show(ex.Message, "Atlas Error while Loading", MessageBoxButton.OK, MessageBoxImage.Error)
    Finally

    End Try

End Sub

 Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)

    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

    LoadLoad()

End Sub

Private Sub LoadLoad()

    Dispatcher.BeginInvoke(Sub() LoadLoad())

    txtSearch.Text = ""

    Dim dc = New VSCSystemEntities1

    Dim ContainsSearch = New List(Of tblActgPayeeTransactionAccounts2)


    Try

        ContainsSearch = (From z In dc.tblActgPayeeTransactionAccounts2 Select z Where z.intActgAcctID <> 236).ToList

        For Each item In (ContainsSearch)
            For i = 1 To ContainsSearch.Count

                aList.add(New PayeeTransactions() With {.AccountingAccountID = item.intActgAcctID, .ProgramCode = item.chrPgmCode, _
                                                   .CarrierCode = item.intCarrierCode, .DealerNumber = item.chrDlrNum, _
                                                         .CoverageCode = item.chrCvgCode, .PayeeType = item.chrPayeeType, .FeeType = item.chrFeeType, .PayeeCode = item.intPayeeCode.ToString, _
                                                         .TransactionType = item.chrTransType, .AccountID = item.inbAcctgID, _
                                                         .CarrierDescription = item.chrCarrierDesc, .CarrierDescriptionShort = item.chrCarrierDescSht, _
                                                        .AccountCustomerID = item.intAcctCustID.ToString, .AccountCode = item.intAcctCo, _
                                                         .AccountCodeReceived = item.intAcctCoRec})
                System.Threading.Thread.Sleep(200)
                bw.ReportProgress(i)
            Next
        Next

        lblCount.Content = ContainsSearch.Count()
        dGrid.ItemsSource = Nothing
        _ContainsText = CollectionViewSource.GetDefaultView(aList)
        dGrid.ItemsSource = _ContainsText

    Catch ex As Exception
        Throw New Exception("Error: " & ex.Message)
    Finally
        dc.Dispose()
    End Try
End Sub


Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
    Me.tbProgress.Text = e.ProgressPercentage.ToString() & "%"
End Sub

Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    If e.Cancelled = True Then
        Me.tbProgress.Text = "Canceled!"
    ElseIf e.Error IsNot Nothing Then
        Me.tbProgress.Text = "Error: " & e.Error.Message
    Else
        Me.tbProgress.Text = "Done!"
    End If
End Sub

 Private Sub btnRefresh_Click(sender As Object, e As RoutedEventArgs) Handles btnRefresh.Click

    If Not bw.IsBusy = True Then
        bw.RunWorkerAsync()
    End If

End Sub

0 个答案:

没有答案