- ベストアンサー
C#のイベントとは? メッセージキューとの関係を解説
- C#ではイベントというものが利用されますが、これはMFC C++のウィンドウメッセージに似た仕組みです。イベントはメッセージキューにためられたメッセージが処理される際に呼ばれるものであり、ウィンドウハンドルを使用せずにウィンドウメッセージを送ることができます。
- しかし、イベントとウィンドウメッセージは異なるものであり、割り込みとも異なります。入門書で使い方を学んだ方もいるかもしれませんが、仕組み的な部分が理解しづらいと感じることもあります。
- そこで、C#のイベントとメッセージキューの関係について分かりやすく解説します。イベントの仕組みや使い方を理解することで、より効率的にC#を利用することができるでしょう。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ウィンドウメッセージだと、 > PostするとキューにたまってFIFOで処理されますが、 > イベントを発行した場合はどうなんだろうと疑問に思った次第です。 ウィンドウメッセージとC#のeventは無関係です。 WinFormsの一部のイベントはウィンドウメッセージによって作り出されますが, これはC#のeventの本質とは関係しません。 > イベントの場合だと、 > 例えば複数のスレッドからイベントが発生した場合、 > あるイベントの処理中に別のイベントの処理が起こるとか...。 イベントの発生とは本質的にデリゲートの実行です。 public event EventHandler Foo; は private EventHandler _Foo; // 実際には<>とかが付いてアクセスできない名前が使われる public event EventHandler Foo { add { _Foo += value; } remove { _Foo -= value; } } ですし,上記に対して, Foo(this, EventArgs.Empty); は実際には _Foo(this, EventArgs.Empty); となっています。 つまり,イベントの発生とはデリゲートの通常の呼び出しに過ぎません。 このため,イベントハンドラの実行はイベントが実際に呼び出されたスレッドで実行されます。 # BackgroundWorkerのように,トリガとイベントが別のスレッド,ということはできる。 また,イベントハンドラがイベントのトリガを引けば当然イベントが発生します。 それを抑止することもあるでしょうけれども,それはトリガ側の実装次第になります。
その他の回答 (2)
- lv4u
- ベストアンサー率27% (1862/6715)
>>これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。 C#でプログラムを作っていたときは、同じようなものと思ってやっていましたよ。 ちょっと標準ではない処理を実行する場合、メッセージを送ることもやりました。 >>ウィンドウハンドルとかないし、違うような気がしますね...。 C#でもウインドウハンドルの取得をやったりします。 >>仕組み的なところがしっくりきません。 入門書には、そういう部分は記述されていないと思います。そこまで記述したら初心者はついてこれないかも? 私の場合は、入門書やリファレンス本、C#文法書を見たあと、 ・究極のC#プログラミング/新スタイルによる実戦的コーディング ・C#によるコンポーネントプログラミング ・プログラミングADO.NET 2.0 ・プログラミング.NET Framework ・メタプログラミング.NET などを読みました。仕組み的な面は、「メタプログラミング.NET」を読まれるのがいいと思います。
お礼
回答をありがとうございました。 たくさんの本を読まれているんですね。 やはりプロはそのくらい知識を持ってないとできないものなのでしょうね。 精進したいと思います。 と、言ってもそんなに開発の機会はないのですが。 ウィンドウメッセージだと、 PostするとキューにたまってFIFOで処理されますが、 イベントを発行した場合はどうなんだろうと疑問に思った次第です。 ウィンドウメッセージの場合は、 ひとつのメッセージの処理を終えてシステムに制御が戻るまで、 次のメッセージは処理されないけれども、 イベントの場合だと、 例えば複数のスレッドからイベントが発生した場合、 あるイベントの処理中に別のイベントの処理が起こるとか...。 そんなことはないですね。
- Yune-Kichi
- ベストアンサー率74% (465/626)
C#のイベントは言語仕様化されたObserverパターンです。
お礼
回答をありがとうございます。 言語仕様化されたObserverパターンですか...。 早速調べてみました。 モデル、というか、概念、というか、 そういうのは分かりました。 勉強が必要です。 ありがとうございました。
お礼
回答をありがとうございます。 そうですよね、ウィンドウメッセージとは関係ありませんね。 いまの知識では、教えていただだいたことを、まだ完全には理解できませんが、 なんとなくわかりました。 まだよく分かっていないせいもあって、 ウィンドウメッセージに比べて、 イベントに対して漠然とした不安があります。 その不安がうまく表現できない...。 ウィンドウメッセージだとキューにたまって FIFO が保障されるけど(Sendを除き)、 イベントはそのあたりがよく分からないのですが、 なにが問題に思えるのか自分でもよくまとまっていません。 とりあえずもう少しプログラミングをしつつ勉強してみます。 ありがとうございました。