0

メッセージを含むテキスト ボックスをステータス ログとして更新するメソッドを公開したいと考えています。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

また、これは非常にエレガントだとは思いません...特にログサイズの制限を追加する場合

4

1 に答える 1

0

私はこれを提案します:

Public Sub AddMessage(ByVal newMessage As String)
    If TextBoxStatus.InvokeRequired Then
        TextBoxStatus.BeginInvoke(New Action(Of String)(AddressOf AddMessage), newMessage)
    Else
        TextBoxStatus.AppendText(newMessage)
    End If
End Sub
于 2016-10-12T23:05:51.533 に答える