メッセージを含むテキスト ボックスをステータス ログとして更新するメソッドを公開したいと考えています。AppendText メソッドを使用したいのですが、使用時に奇妙なマルチスレッドの問題が発生しています。連結によって新しいメッセージを追加できます。この問題は、テキスト ボックスが表示されていないことを示しており、フォームを閉じるときにクロス スレッド アクセス エラーが表示されます。機能するものと機能しないものの例を次に示します。
最後の手段である追加の手順を実行しない限り、機能しますが、AppendText とは異なります。
Public Sub AddMessage2(ByVal newMessage As String)
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf)
Else
TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf
End If
End Sub
使用したいが機能しないもの:
Public Sub AddMessage(ByVal newMessage As String)
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
Else
TextBoxStatus.AppendText(newMessage)
End If
End Sub
追加情報と更新情報: まず最初に、事前に十分な情報を提供できなかったことをお詫びします。
次のコードが機能するため、少なくとも問題の一部は、フォームをインスタンス化し、呼び出すAddMessage(newMessage)
前に呼び出しているようです。Show()
Public Sub AddMessage(ByVal newMessage As String)
If Me.Created Then
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
Else
TextBoxStatus.AppendText(newMessage)
End If
End If
End Sub
私はいつでも次のようなことをすることができますが、何が起こっているのか知りたいです:)
Private backLog As String = ""
Public Sub AddMessage(ByVal newMessage As String)
If Me.Created Then
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(backLog & newMessage))
Else
TextBoxStatus.AppendText(backLog & newMessage)
End If
backLog = ""
Else
backLog &= newMessage
End If
End Sub
また、これは非常にエレガントだとは思いません...特にログサイズの制限を追加する場合