2012-12-26 2 views
5

スレッドは、私が持っていると仮定します。次に何が起こるのですか?処理が完了し、別のイベントが発生するか、新しいイベントが新しいスレッドですぐに発生しますか?イベントや

+0

「ethernet_adapter」はどのような種類のオブジェクトですか? –

+0

@ JimMischelサードパーティ製ライブラリタイプの 'ICaptureDevice'です。私は答えがあると思う。 – ren

答えて

2

どのようにイベントがタイプ(ethernet_adapterオブジェクト)によって発生したかに応じて、何でもかまいません。

同期操作の場合、現在の操作が実行されるまで新しいイベントは発生しません。

非同期操作の場合は、新しいイベントがすぐに発生します。 (あなたの例のように)

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

限り処理同期加入者のすべての加入者を介して内部列挙をブロックする:

2

これは同期操作である可能性があります。別のスレッドで発生する唯一の方法は、イベントを発生させるオブジェクトが別のスレッドで実行するか、ハンドラで処理するかどうかです。これを行う方法は数多くありますが、.NET 4を使用する場合はSystem.Threading.Tasks.Taskを使用するのが一般的です。

アプリケーションをどのように動作させるかを慎重に検討してください。単に新しいスレッドで各パケットを処理すると、パケットが順不同で処理される可能性があります。それらをキューに入れ、その時点でバックグラウンドスレッドで処理することができます。あるいは、何もする必要がないかもしれません。

0

ThreadPoolでタスク全体をフォローすることができます。

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

またはすべてのスレッドに対してタスク(.net 4.0)を作成できます。

+0

これはOP質問にどのように関連していますか? – Tilak

+0

各長い処理項目はスレッドプール内のキューに入れることができ、それに応じて処理されます。問題が分かっていれば幸いです。 – paritosh

+0

私は、 "非同期処理を行う方法"ではなく、 "動作は何ですか"と質問します。 – Tilak

0

は恐らくあなたのethernet_adapterクラスの方法があります。しかし!毎回別のスレッドでethernet_adapterを呼び出すと、それ以降の呼び出しをブロックすることはできません.2つの並行処理が同時に行われます。

例として、Socketの実装を見てみましょう。非同期メソッドはIOCPスレッドに完了コールバックを呼び出すようにします(IO ThreadPoolに何かがある間は毎回異なります)。

関連する問題