9

私のアプリケーションのユーザーは、HTML を TextBox コントロールに入力します。

アプリケーションで入力をバックグラウンドで検証する必要があります。

検証サービスに負担をかけたくないので、各検証の前に 1 秒の遅延を組み込むようにしました。

ただし、既に実行中の BackgroundWorker プロセスを正しく中断できないようです。

私のVisual Basicコード:

Sub W3CValidate(ByVal WholeDocumentText As String)

    '既に実行中の検証を停止します
    If ValidationWorker.IsBusy Then
        ValidationWorker.CancelAsync()
        '準備が整うまでお待ちください
        While ValidationWorker.IsBusy
            '100 分の 1 秒間停止します
            System.Threading.Thread.Sleep(New TimeSpan(0, 0, 0, 0, 10))
        終了
    終了条件

    '検証を開始します
    Dim ValidationArgument As W3CValidator = New W3CValidator(WholeDocumentText)
    ValidationWorker.RunWorkerAsync(ValidationArgument)

サブ終了

BackgroundWorker の CancelAsync() を呼び出した後、IsBusy が False になることはないようです。無限ループに陥ります。

私は何を間違っていますか?

4

3 に答える 3

8

次のようなものを試してください。

bool restartWorker = false;

    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
                    // add other code here
        if (e.Cancelled && restartWorker)
        {
            restartWorker = false;
            backgroundWorker1.RunWorkerAsync();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (backgroundWorker1.IsBusy)
        {
            restartWorker = true;
            backgroundWorker1.CancelAsync();
        }
        else
            backgroundWorker1.RunWorkerAsync();
    }
于 2009-05-27T13:10:01.673 に答える
1

バックグラウンドワーカーのプロセスループでは、チェックしてそれに応じて終了する必要があります
backgroundWorkerPageProcess.CancellationPending
。次に、それが存在すると、whileループisBusyにそれに応じてフラグを立てる必要があります。

更新:Cancel = trueを設定した後、メソッドから戻りますか?ここ で唾を吐く更新2:バックグラウンドワーカーでWorkerSupportsCancellationフラグがtrueに設定されていますか?また、労働者が完了したメソッドでは、e.Cancelled....より多くのスピットボールが返されます

更新3:自分でチェックしてコンパイルした後、同じメソッド内でひどいことが忙しさから抜け出すことは決してないようです。-1つのオプションは、ビジー状態のときにボタンを無効にし、別のオプションをキャンセルして、ユーザーが検証を再度クリックすることだけです。-または、ワーカーが完了したメソッドで、適切なテキストを使用して検証メソッドを呼び出した場合(e.Cancelled)...

どちらの方法もバストのようなものです。ここではあまり役に立たないことをお詫びします。

于 2009-03-11T15:58:36.270 に答える
0

この記事で答えを見つけました:

Patrick Smacchia によるBackgroundWorker のクロージャとオーバーライド可能なタスク

私は彼のコードを適応させました:

Private _ValidationArgument As W3CValidator

Sub W3CValidate(ByVal WholeDocumentText As String)
    _ValidationArgument IsNot Nothing の場合
        _ValidationArgument = New W3CValidator(WholeDocumentText)
        サブを終了
    終了条件
    If Not ValidationWorker.IsBusy Then
        ValidationWorker.RunWorkerAsync(New W3CValidator(WholeDocumentText))
        サブを終了
    終了条件
    _ValidationArgument = New W3CValidator(WholeDocumentText)
    ValidationWorker.CancelAsync()
    新しい Windows.Threading.DispatcherTimer として Dim TimerRetryUntilWorkerNotBusy
    AddHandler TimerRetryUntilWorkerNotBusy.Tick、AddressOf WorkTicker
    TimerRetryUntilWorkerNotBusy.Interval = New TimeSpan(1) '100 ナノ秒
    TimerRetryUntilWorkerNotBusy.Start()
サブ終了

Sub WorkTicker (ByVal sender As Object, ByVal e As System.EventArgs)
    If ValidationWorker.IsBusy Then
        サブを終了
    終了条件
    DirectCast(送信者、Windows.Threading.DispatcherTimer).Stop()
    ValidationWorker.RunWorkerAsync(_ValidationArgument)
    _ValidationArgument = なし
サブ終了
于 2009-03-11T15:55:01.460 に答える