9

私はスレッドの世界に慣れていませんが、私が取り組んでいるアプリのいくつかの側面では、BackgroundWorker コントロールを使用して、ファイル操作中に UI がフリーズするのを防ぐ必要があります。

私がやろうとしているのは、BackgroundWorker 内からいくつかのフォーム ラベルを更新することです。同じスレッド内で作成されていないコントロールにアクセスできないことがすぐにわかったので、少し調査した後、すべてが機能するように見える次のコードを実装しました。

Private Delegate Sub DelegateUpdateStatus(ByVal statusText As String, ByRef currentFile As String)

Private Sub UpdateStatus(ByVal statusText As String, ByVal currentFile As String)

    If InvokeRequired Then
        Invoke(Sub() LblStatus.Text = statusText)
        Invoke(Sub() LblCurrentFile.Text = currentFile)
    Else
        LblStatus.Text = statusText
        LblCurrentFile.Text = currentFile
    End If

End Sub

ただし、このコードが何をしているのか、なぜ必要なのかはわかりません。

私は少し調査を行いましたが、この種の実際の作業は行っていません。また、私が読んだほとんどの記事は、何らかの予備知識があることを前提としています。

私が理解しようとしている 3 つの主な事柄は次のとおりです。

  • このコードが必要な理由 (たとえば、BackgroundWorker からコントロールに直接アクセスできない理由)
  • デリゲートとは何か、またデリゲートの使用が必要な場合
  • Invoke メソッドの機能と InvokeRequired でチェックしていること

前述のように、スレッド化はまだかなり異質な概念であるため、平易な英語での回答は非常に役立ちます-ありがとう!

編集:これまでの反応に感謝します。私はさらにいくつかの読書をしましたが、これについて正しい方法で行っているかどうか疑問に思っています。私が BackgroundWorker を使用している理由は、ファイル操作の実行中に UI の応答性を維持するためです。問題は、操作の成功を示すブール値を返すことができるように、BackgroundWorker がその仕事を完了するまで待つ必要があることです。これを回避する方法はありますが、私の読書によると、BackgroundWorker が作業を完了するのを待たなければならないことは、そもそもそれを使用する目的に反しています。では、UI がロックアップしないようにする最善の方法は何でしょうか?

4

3 に答える 3