したがって、基本的には、アプリケーションで CPU を大量に使用するメソッドを実行する必要があり、その間、別のフォームにステータス情報を常に表示する必要があります。このステータス フォームがフリーズするのを防ぐために、コードを新しいスレッドに外部委託することをお勧めします。
最初に、基本的なスレッド化を使用して、ステータス メッセージを表示するリッチテキスト ボックス コントロールを呼び出してみました。- 問題は - メインスレッドを続行するには、スレッドがいつ終了するかを知る必要があります。明らかに、プロセスが終了したかどうかをチェックし続けるメインスレッドで単純にループを実行することはできません。これにより、GUI もフリーズします。
そこで、少し調べてみて、Tasks について知りました。それがどのように見えるかです:
Dim z as new complexProcessClass
Dim taskA = task.Factory.StartNew(Sub() z.start())
taskA.Wait()
If taskA.IsCompleted Then
MsgBox("finished")
End If
そして、プロセスがステータスを報告するたびに、私はこれを使用します:
Public Class complexProcessClass
dim statusWindow as statusForm
Public Sub start()
statusWindow = new statusForm
'complex code here
reportStatus("bla")
'complex code here
reportStatus("blabla")
'complex code here
End Sub
Private Delegate Sub UpdateTextHandler(ByVal Text As String)
Private Sub reportStatus(Byval s as String)
If z.RichTextBox1.InvokeRequired Then
Try
z.RichTextBox1.Invoke(New UpdateTextHandler(AddressOf xform.RichTextBox1.AppendText), s)
Catch ex As Exception
MsgBox(ex.ToString())
End Try
Else
z.RichTextBox1.AppendText(s)
End If
End Sub
しかし、呼び出し時にフリーズし続けるだけです-エラーメッセージはありません-何もありません?!
誰でもこれを行う正しい方法を教えてもらえますか? -そして、バックグラウンドワーカーの解決策はありません;)
前もって感謝します