Member 13857021 Ответов: 1

Как обновить backgroundworker - VB.NET


Я хочу обновить backgroundworker, чтобы обновить его, когда я нажимаю на кнопку. Это делается для того, чтобы метка обновилась сразу после обновления. Однако, когда я это делаю, я получаю ошибку Background worker is busy. Поэтому я хочу, чтобы только backgroundworker подождал, пока работа не закончится, и запустил ее снова. Пожалуйста, помогите.

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

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        BackgroundWorker1.WorkerSupportsCancellation = True


        Try
            Dim ur As New Uri("http://www.find-ip-address.org/")
            Dim req As HttpWebRequest = HttpWebRequest.Create(ur)
            Dim res As HttpWebResponse = req.GetResponse()
            If (res.StatusCode = HttpStatusCode.OK) Then
                Dim receiveStream As Stream = res.GetResponseStream()
                Dim readStream As StreamReader = Nothing
                If (res.CharacterSet = Nothing) Then
                    readStream = New StreamReader(receiveStream)
                Else
                    readStream = New StreamReader(receiveStream, Encoding.GetEncoding(res.CharacterSet))
                    Dim data As String = readStream.ReadToEnd()
                    res.Close()
                    readStream.Close()
                    Dim left = "My IP Country Name:"
                    Dim right = "IP Address Lookup Location"
                    Dim indexLeft As Integer = data.IndexOf(left)
                    Dim indexRight As Integer = data.IndexOf(right)
                    lookupData = data.Substring(indexLeft + left.Length, indexRight - indexLeft - left.Length)
                    flagLocation = extractSubject("</font>  <img src='", "'><br>My IP Country Continent<")
                End If
            End If
        Catch
        End Try
    End Sub
    Private Function extractSubject(ByVal left As String, ByVal right As String)
        Try
            Dim indexLeft As Integer = lookupData.IndexOf(left)
            Dim indexRight As Integer = lookupData.IndexOf(right)
            Return lookupData.Substring(indexLeft + left.Length, indexRight - indexLeft - left.Length)
        Catch
            Return "Not Resolved!"
        End Try
    End Function
#Region "informations"
    Private Function publicIP() As String
        Return extractSubject(">My IP Address lookup for ", " show IP which")
    End Function
#End Region
    Public Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        tbPublicIP.Text = publicIP()
        BackgroundWorker1.CancelAsync()
    End Sub

Gerry Schmitz

Где твой "рабочий" код? Вот где распознается "отмена"; не в том, что вы показали.

Member 13857021

Отредактировал код. Кнопка должна обновить работника, чтобы получить новый IP-адрес.

1 Ответов

Рейтинг:
10

Gerry Schmitz

1) я предлагаю вам изучить пример кода BGW и научиться правильно кодировать BGW.

Класс BackgroundWorker (System.ComponentModel)[^]

2) поскольку доступ к сети осуществляется асинхронно, использование BGW также не является лучшим выбором.

Пошаговое руководство: доступ к интернету с помощью async и await (C#) | Microsoft Docs[^]


Member 13857021

Я использовал занята, а вместе с Backgroundworker. Это хорошо работает. Спасибо Вам за помощь.