0

私は混乱しています。はい、同じバックグラウンド ワーカーを使用して 2 つのタスクを同時に実行できないことは理解しています。わからないのはこれです。これが私のコードです(これが行うことは、プログレスバーのmarqueanimationspeedを設定することだけです...

'THE FOLLOWING SUB TOGGLES THE PROGRESS BAR
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then

        ToolStripProgressBar1.MarqueeAnimationSpeed = 22

    End If

    ToolStripProgressBar1.MarqueeAnimationSpeed = 0


End Sub

では、これにはどれくらいの時間がかかりますか? ワーカーはタスクを実行して終了しませんか? だから私は一時停止しました(system.threading.thread.sleep(2000)...同じ問題、20秒にしました...同じ問題。

だから、これは私が見逃している単純なものだと思いますが、検索に1時間以上費やしましたが、わかりません.

ここで達成しようとしているのは、UI が何か他のものを実行している間にマーキー プログレス バーを開始し、それを停止することだけです。別のバックグラウンドワーカーを作成してそれを使用できると思いますが、最初のバックグラウンドワーカーがタスクで完了していない理由を理解したいと思います。

ありがとう、また、はい、私は1時間かけて検索し、あらゆる種類の「解決策」を見つけましたが、なぜこのことが終わっていないのかについての説明はありません.

わかりました、BGW を呼び出しているサブはこちらです

    'THE FOLLOWING SUB FIRES THE SETTING CONNECTION STRINGS SUB
Private Sub SetCSButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SetCSButton.Click

    'START THE PROGRESS BAR & CHANGE THE LABEL
    BackgroundWorker1.RunWorkerAsync()
    Threading.Thread.Sleep(1000)
    ToolStripStatusLabel1.Text = "Preparing the connection strings..."
    Me.Refresh()


    thread3 = New System.Threading.Thread(AddressOf SetConnectionStrings)
    thread3.Start()

    'STOP THE PROGRESS BAR & CHANGE THE LABEL
    BackgroundWorker2.RunWorkerAsync()
    Threading.Thread.Sleep(1000)
    ToolStripStatusLabel1.Text = "Standing by..."
    Me.Refresh()

End Sub**strong text**

20 秒の遅延がありましたが、まだ最初の BGW が終了していません。私はこれが簡単なことだと知っていますが、私は理解していません。それが私がここにいるすべてです。

私はコードを変更し、この質問を書いたときに試していたのと同じ方法論を使用していません...私が理解していないのは、単純な操作が明らかに決して終了しない理由です...そうは言っても、それはrunworkercompleted イベントを使用して msgbox を表示できたので終了します。だから、私が伝えようとして失敗したように、thbisはコーディングの正しい方法または間違った方法に関するものではなく、それが間違っていることを知っており、それにもかかわらず、私は今それをしていませんが、 BGWが「まだ機能している」理由がわかりません。私が無知な単純なことがあるに違いありません。

ありがとう

4

1 に答える 1

1

エラーは投稿されたコードではなく、Bgwを開始する場所にあります。

ただし、DoWorkからGUIに触れてはならないため、これはすべて無関係です。

Private Sub BackgroundWorker1_DoWork(...) Handles BackgroundWorker1.DoWork

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then   ' Boom, cross-threading violation

        ToolStripProgressBar1.MarqueeAnimationSpeed = 22

    End If

ここではBgw、スレッド、タイマーは必要ないと思います。スローアクションの前後で速度を変えるだけです。

于 2012-12-16T18:16:43.787 に答える