2012-01-19 14 views
0

私はすべてのデータのためのTCP接続を監視し、メッセージ全体を受け取ってきたイベントを起動し、プログラムを持っています。リスナーは、UIスレッドとは別のスレッドにあります。イベントが発生すると、メッセージにUIの変更が必要な場合は、現在の変更を含むフォームを呼び出します。この呼び出しにヒットした場合、Eventからトリガーされたリスナーの関数は、クロススレッド操作に無効なエラーを出します。私は呼び出すことによってそのエラーを回避しようとしているときに、イベントを呼び出したスレッドがそのエラーを表示する理由を理解できません。例:コマンドの起動なしクロススレッド動作の「滝戻る」

if (cmd == "NEWID") 
{ 
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1))); 
    this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; //Cross-Thread Here 
} 

クロススレッドがthis.Text変化にフラグを立てています。

私が起動追加:

if (cmd == "NEWID") 
{ 
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1))); 
    this.Invoke(new MethodInvoker(delegate { this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; })); 
} 

クロススレッドがイベントを発射した関数にフラグを立てている:

if (NewMessage != null && NetworkConnectionState != ConnectionState.Closing) 
    NewMessage(this, cl, data); //Cross-Thread Here 

NewMessage機能が登録されているイベントです

public delegate void RecievedMessage(object sender, Client messageSender, byte[] message); 
    public event RecievedMessage NewMessage; 

正しいスレッドを呼び出すときにクロススレッドが「移動」された理由を理解できません。ひどい。どんな助けも素晴らしいだろう!

+0

'NewMessage'機能は何をしますか?どんな風に見えますか? –

+0

NewMessageは、に登録されているイベントです。その情報でオリジナルの投稿を編集しました。 – Skintkingle

答えて

0

私は絶対にないアイデア理由が、再構築完全にやっては(溶液中のすべてのプロジェクトを再構築)問題を整流していません。問題は、私が変更したプロジェクトのソースコードが、スタックトレース上で使用可能な最も近い有効なソースコードでクロススレッドエラーを表示していたオペレーティングプログラムのソースと異なるためです。

奇妙な私は、ソースコードが異なっていたことを警告されていなかった。しかし、それはしかし、問題を修正しました。私はこれが同じ問題を持つ他の誰かを助けることを願っています。クロススレッドの問題がスタックトレース内の以前の場所に "戻る"ように見えるのは、本当に私を驚かせました。

関連する問題