2011-10-12 12 views
5

イム:は、クロススレッド操作ではない有効な

Private Delegate Sub StringDelegateChat(text As String, window As ChatWindow) 
    Private Sub AppendTextChatWindows(text As String, window As ChatWindow) 
     Try    
      If window.RichTextBox1.InvokeRequired Then 
       window.Invoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window) 
      Else 
       window.RichTextBox1.AppendText(text) 
       window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length 
       window.RichTextBox1.ScrollToCaret() 
      End If 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString) 
     End Try 
    End Sub 

しかし、私は、クロススレッド操作有効でないエラーを取得し、私はそれがこれを行うと思いますこれはif文の一部であるwindow.invokeが欠落しているためです。私もIf window.RichTextBox1.InvokeRequired ThenIf InvokeRequired Thenに置き換えようとしましたが、continueループで捕捉され、スタックオーバーフローエラーがスローされます。私は信じて

おかげ Houlahan

+0

既に試みましたwindow.Invoke window.RichTextBox1.InvokeRequiredの代わりに? –

+0

elseをスキップして例外をトローすると、/ – Houlahan

+0

コントロールハンドルが作成されたことは間違いありませんか?もしあなたがいても、それはダブルチェックを傷つけることはありません... – jmoreno

答えて

6

は、5行目に、window.Invokewindow.RichTextBox1.Invokeに変更する必要があります。

Private Delegate Sub StringDelegateChat(text As String, window As ChatWindow) 
Private Sub AppendTextChatWindows(text As String, window As ChatWindow) 
    Try 
     If window.RichTextBox1.InvokeRequired Then 
      window.RichTextBox1.Invoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window) 
     Else 
      window.RichTextBox1.AppendText(text) 
      window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length 
      window.RichTextBox1.ScrollToCaret() 
     End If 
    Catch ex As Exception 
     MessageBox.Show(ex.ToString) 
    End Try 
End Sub 
0

コード内にエラーが表示されません。 RichTextboxの更新時に発生するイベントを確認したい場合があります。クロススレッドを引き起こしている可能性があります。

問題を回避するために、オブジェクトを使用すると、スレッド間の問題が発生する可能性は低くなります。

3

あなたが試してみました:

Private Sub AppendTextChatWindows(text As String, window As ChatWindow) 
     Try    
      If window.RichTextBox1.InvokeRequired Then 
       window.RichTextBox1.BeginInvoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window) 
       Exit Sub 
      Else 
       window.RichTextBox1.AppendText(text) 
       window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length 
       window.RichTextBox1.ScrollToCaret() 
      End If 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString) 
     End Try 
    End Sub 

は基本的に、私はBeginInvokeメソッドではなく、起動について尋ねています。私は、言及した別のポスターのように、同じことを使用している必要がありますが、呼び出す必要性をチェックします。 (つまり、両方のwindow.invokeRequired & window.BeginInvokeまたはコントロール)

関連する問題