1

Socket を持つクラスがあり、クライアントをリッスンしてデータを受信します。新しいデータを受信するときにイベントを呼び出したい (実装されている場合) が、ご存知のように、すべての接続には独自のスレッドがあるため、イベントはそのスレッドで実行され、残りはわかります。フォーム コントロールを操作することはできません。イベントを呼び出す (または呼び出す) 方法を教えてください。私はスレッドとネットワークのプログラミングに本当に慣れていないので、例に感謝します。

public class HVremotechooser
{
    public delegate void NewOrder(Order order);
    public event NewOrder nOrder;

    //... (code elided)


    public void ReceiveCallback(IAsyncResult AsyncCall)  // new connection of client
    {

         //... (code elided)
         if (nOrder != null)
              nOrder(Order);   // calling the event "nOrder"
         //... (code elided)

    }

}

ありがとうございました。

4

4 に答える 4

0

Invokeまたはのような典型的なマーシュリング操作を使用してBeginInvoke、デリゲートの実行を UI スレッドに挿入できます。ISynchronizeInvokeまたはのインスタンスをSynchronizationContextクラスに渡すだけで、マーシャリングが容易になります。

ただし、あなたの場合はそうしません。いずれにせよ、おそらくこれらのコールバックはソケット イベントのために発生しているため、ハードで重く発生している可能性があります。そのすべてのアクティビティで UI スレッドをバタンと閉めたくはありません。System.Windows.Forms.Timer代わりに、関連するすべてのデータをパッケージ化し、UI スレッドがより適切な間隔でポーリングできるコレクションに入れます。

私はいつもこれらのマーシュリング操作を破っています。それらは過大評価され、過度に使用されています。UI とワーカー スレッド間でデータを共有し、信号を送る一般的な方法が 2 つあります。

  • Invokeワーカー スレッド経由またはBeginInvokeワーカー スレッド内でメソッドをプッシュする
  • System.Windows.Forms.TimerUI スレッドでメソッドをプルする

pull メソッドは、よりエレガントな場合があり、多くの場合、よりエレガントです。

于 2012-04-12T02:43:34.380 に答える
0

UI スレッディングは UI の問題です。私の意見では、このコードで ui スレッドを呼び出すことについて心配する必要はありません。むしろ、イベントの消費者は、Invokeたまたま実行する必要があるその他のスレッド処理を実行する必要があります。そうすれば、UI 担当者が戦略を変更する必要がある場合 (タイマーを使用するなど)、UI に関連しないコードを変更する必要がなくなります。

于 2012-04-12T04:26:31.947 に答える