Ошибка закрытия формы события фонового события - PullRequest
0 голосов
/ 18 марта 2020

У меня есть фоновое событие, которое соответствует данным aws. Когда я закрываю форму фоновое событие не отменяется по какой-то причине. Если я разрешаю сообщение между ними, я пытаюсь поставить временную паузу, REFRE SH и обе. Но он работает только после окна сообщения. Я не очень понимаю, почему, так как кнопка само по себе, чтобы отменить работает нормально, когда форма не закрывается. ОШИБКА "Невозможно получить доступ к удаленному объекту. Имя объекта: 'Form1'." Каким-то образом он не видит «Ложь» при закрытии. Спасибо!

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing   
    RED(False)
    'Some other functions - WORK OK     
End Sub

Private Sub RED(ByVal reads As Boolean)
    bck.WorkerSupportsCancellation = True
    If reads = True Then
        bck.RunWorkerAsync()
    ElseIf reads = False Then
        bck.CancelAsync()
        bck.Dispose()
    End If
End Sub

Private Sub bck_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bck.DoWork
    Do
        If bck.CancellationPending = True Then --- DOESN'T look like see this without Message BOX
            Exit Sub
        End If
        Me.Invoke(Sub()
                     'EVENT HERE WERE I AM GETTING AN ERROR --- HOWEVER, Works as a button when called on RED(False) and Works if I put a message BOX
                  End Sub)
    Loop
End Sub

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Используйте ОТЧЕТ О ПРОГРЕССЕ вместо Invoke.

 Private Sub bck_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bck.DoWork
        Do
            If bck.CancellationPending = True Then 
                Exit Sub
            End If
            bck.ReportProgress("WHATEVER YOU CAPTURING/VALUES UPDATE")
        Loop
    End Sub
Private Sub bck_dProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bck.ProgressChanged

               YOUR DISPLAY = ("WHATEVER YOU CAPTURING/VALUES UPDATE")


    End Sub
0 голосов
/ 18 марта 2020

Казалось бы, это вопрос времени, как это часто бывает с несколькими потоками. Я хотел бы предложить следующее: если форма закрывается во время выполнения фоновой задачи, вы отменяете фоновую задачу, а затем отменяете закрытие. Затем вы можете снова закрыть после завершения фоновой задачи, например,

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Do
        If BackgroundWorker1.CancellationPending Then
            'Cancel the background work.
            Exit Do
        End If

        'Do the background work.
        '...
    Loop
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    'Close the form.
    Close()
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    If BackgroundWorker1.IsBusy Then
        'Cancel the background task.
        BackgroundWorker1.CancelAsync()

        'Do not close the form this time.
        e.Cancel = True
    End If
End Sub

Если вы не всегда хотите закрывать форму после завершения фоновой задачи, вы можете указать это обработчику событий RunWorkerCompleted например, установив e.Result в обработчике DoWork, а затем протестировав его в обработчике RunWorkerCompleted, например

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    e.Result = False

    Do
        If BackgroundWorker1.CancellationPending Then
            e.Result = True

            'Cancel the background work.
            Exit Do
        End If

        'Do the background work.
        '...
    Loop
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If CBool(e.Result) Then
        'Close the form.
        Close()
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...