2017-12-10 10 views
0

works here ----- crashes here ----- 私はこのサーバクライアントチャットシステムをメッセージキューとクライアント側で作成していますメッセージを受け取るスレッドを持つ。私のリストボックスの名前は「displaymsg」ランダムなメソッドからリストボックスにアクセスできない(C#)

であるここに私のスレッドプール方式

public void getmsg(object ob) 
    { 
     string msg = ""; 

     while (true) 
     { 
      msg = mRecieve.GetMessages(); 
      displaymsg.Items.Add(msg); 
     } 
    } 

だ。しかし、それはdisplaymsg.Items.Add(MSG)部分に到達したときにプログラムがクラッシュしています。 それが届いているかどうかチェックし、うまくいけば、私はそれをMessageBox.Show(msg)に置き換えました。うまくいきました。私は他の人から送るポップアップボックスにすべてのメッセージを受け取ります。私はwpfに新しいのでちょっと失った...助けてください!

+1

あなたはどのようなメッセージを受け取ります非稼動の場合は?私はこれが間違ったスレッドからコントロールにアクセスしようとしていることが原因であると思われますが、エラーメッセージは表示されません。 – SoronelHaetir

+0

エラーメッセージは表示されません。ちょうどクラッシュ "クライアントが動作を停止した、窓はこの問題を報告しています" – Shrey

+0

@ Shreyあなたのプログラムのあなたのwhileループは、実際にそのように書かれていますか?一方、(真)は無限に続く。追加するアイテムが無限に作成されている場合は、すべてのコンピュータリソースを消費しているため、クラッシュする可能性があります。 – Jamin

答えて

1

UI以外のスレッドからコントロールにアクセスすることはできません。あなたは戻って、UIスレッドにそれをマーシャリングするa dispatcherを使用する必要があります。

displaymsg.Dispatcher.Invoke(() => displaymsg.Items.Add(msg)); 

あなたは結果を待つしたくない場合は、また、火災や忘れることができます。

displaymsg.Dispatcher.BeginInvoke(() => displaymsg.Items.Add(msg)); 
+0

これは非常に有益な答えでした。ありがとう@Sefe :) – Shrey

+0

@Shrey [誰かが私の質問に答えるときに何をすべきですか?](https://stackoverflow.com/help/someone-answers)あなたの質問に回答の内容を編集しないでください。 – Clemens

関連する問題