Я пытаюсь реализовать BackgroundWorker в своем коде vb.net. Я понимаю, что вы не можете обновить пользовательский интерфейс из фонового рабочего. Так как при установке точек останова в моем коде в подпрограмме Backgroundworker.DoWork я бы получил
Me.Accessibility.Object сгенерировал исключение типа 'System.InvalidOperationException'
Сообщение «Операция между потоками недопустима: доступ к элементу управления FrmLoad осуществляется из потока, отличного от потока, в котором он был создан».
Чтобы попытаться понять, почему это происходит, я ТОЧНО скопировал код из
https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netframework-4.7.2
и при повторной установке точек останова в подпрограмме DoWork я получаю то же исключение. Я пробовал несколько других примеров кода Microsoft с той же проблемой. Что-то не так с кодом?
Imports System
Imports System.ComponentModel
Imports System.Windows.Forms
Namespace BackgroundWorkerSimple
Public Partial Class Form1
Inherits Form
Public Sub New()
InitializeComponent()
backgroundWorker1.WorkerReportsProgress = True
backgroundWorker1.WorkerSupportsCancellation = True
End Sub
Private Sub startAsyncButton_Click(ByVal sender As Object, ByVal e As EventArgs)
If backgroundWorker1.IsBusy <> True Then
backgroundWorker1.RunWorkerAsync()
End If
End Sub
Private Sub cancelAsyncButton_Click(ByVal sender As Object, ByVal e As EventArgs)
If backgroundWorker1.WorkerSupportsCancellation = True Then
backgroundWorker1.CancelAsync()
End If
End Sub
Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim worker As BackgroundWorker = TryCast(sender, BackgroundWorker)
For i As Integer = 1 To 10
If worker.CancellationPending = True Then
e.Cancel = True
Exit For
Else
System.Threading.Thread.Sleep(500)
worker.ReportProgress(i * 10)
End If
Next
End Sub
Private Sub backgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
resultLabel.Text = (e.ProgressPercentage.ToString() & "%")
End Sub
Private Sub backgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
If e.Cancelled = True Then
resultLabel.Text = "Canceled!"
ElseIf e.[Error] IsNot Nothing Then
resultLabel.Text = "Error: " & e.[Error].Message
Else
resultLabel.Text = "Done!"
End If
End Sub
End Class
End Namespace
Это на самом деле не мешает запуску кода, но я хочу убедиться, что поток действительно остается безопасным.