困っ情報を全UIのスレッドに別のスレッドのクライアントまで、フルのC#
-
04-07-2019 - |
質問
私のサーバアプリケーションを受けた情報ネットワークやプロセスです。サーバーはマルチスレッドは、取り扱う複数のソケットで、スレッドが作成されずに私の制御を通じてBeginInvokeとEndInvokeスタイルの方法、連鎖により対応するコールバック機能
私が作り出してしまおうというものを形にし、ほかのGUIで表示するListBoxの項目人口による項目を記述する現在接続中のソケットでは、どういはいは追加の項目のListBoxそのAdd()関数からのスレッドの適切なコールバック関数を実行します。私利私の形態制御の制御性-I.E:
(ListBox)c.Controls["listBox1"].Items.Add();
自然だけでなく、機能たって複数の方法がその場で発音を確認することがここで、ウェブサイト間の通信にスレッドを含む MethodInvoker
, を用い delegate
, 組み合わせ Invoke()
, BeginInvoke()
など。もう、私は常に同一の例外を聞かせていただきまして私の制御からのアクセス以外のスレッドで作成されます。
意思い?
解決
お電話呼び出し(やBeginInvoke)のListBoxコアクセスするための委任に対して呼び出されるスレッドが作成される。
ListBox listBox = c.Controls["listBox1"] as ListBox;
if(listBox != null)
{
listBox.Invoke(...);
}
他のヒント
私はいつも使うこれらのテーマに沿った:
c = <your control>
if (c.InvokeRequired)
{
c.BeginInvoke((MethodInvoker)delegate
{
//do something with c
});
}
else
{
//do something with c
}
私も書いたバンチのヘルパーの拡張方法。ます。
using System;
using System.ComponentModel;
public static class CrossThreadHelper
{
public static bool CrossThread<T,R>(this ISynchronizeInvoke value, Action<T, R> action, T sender, R e)
{
if (value.InvokeRequired)
{
value.BeginInvoke(action, new object[] { sender, e });
}
return value.InvokeRequired;
}
}
使うようになります:
private void OnServerMessageReceived(object sender, ClientStateArgs e)
{
if (this.CrossThread((se, ev) => OnServerMessageReceived(se, ev), sender, e)) return;
this.statusTextBox.Text += string.Format("Message Received From: {0}\r\n", e.ClientState);
}
使用BeginInvokeを起動するべきます。とは無関係になりますが短いものの完全にプログラムするものであったことを問題なのでしょうか。対応することができるでしょう仕事をアレンジしたモジュールでない実際に必ずサーバ側のものだけを信じてチームのスレッドの"ふり"への着信接続します。
所属していません StackOverflow