0

私は少し問題を抱えています.バックグラウンドワーカーをアプリケーションに追加する方法をようやく見つけました.唯一の問題は、スレッドを終了しないか、キャンセルボタンをクリックしたときに少なくとも十分に速くないことです. 私は何か間違ったことをしているに違いない。ボタンがクリックされるとすぐにスレッドを中止したいと思います。これは実現可能ですか?私のスレッドは決して広範ではありません。

私が行っている方法のいくつかの例を投稿します。

    Public Sub New()
    InitializeComponent()

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

私の DoWork イベント

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

    If bw.CancellationPending = True Then
        e.Cancel = True
        WorkEventRunning = False

    Else

        CheckForIllegalCrossThreadCalls = False
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
        'my long winded event
         ' more of my long winded event.

   End if

私のキャンセルボタンコード

    Private Sub ToolStripButton2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click
    'Stop
    If bw.WorkerSupportsCancellation = True Then
        WorkEventRunning = False
        bw.CancelAsync()
        bw.Dispose()

    End If

そして、私の仕事は完了しました

     Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    If e.Cancelled = True Then
        'canceled
        WorkEventRunning = False
    ElseIf e.Error IsNot Nothing Then
        MsgBox(e.Error.Message)
    Else
        'done
    End If
End Sub
4

1 に答える 1

1

DoWork イベントで、 内の CancellationPending をテストしlong winded eventます。この長い手順に For-Loop または ForEach が含まれていると仮定すると、すべてのループで CancellationPending をテストします。

例えば:

Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim x as Integer
For x = 0 to 1000000
    If worker.CancellationPending = True Then 
        e.Cancel = True 
        Return 
    Else 
       .... ' Execute the works for this loop
    End If
Next

CancelAsync() は CancellationPending プロパティの内部値を設定するため、RunWorkerCompleted イベント内で同じテストを実行できます。CancelAsync() の内部動作を確認するには、この質問を参照してください。

于 2012-09-01T07:41:33.507 に答える