« July 2005 | Main | September 2005 »

2005.08.26

Asynchronous Pattern

Asynchronous Design Pattern Overview は .NET 1.x で定められた非同期のガイドラインだが、BeginInvoke/EndInvoke による実装では使いづらい場面もある。また AsyncCallback が呼ばれるスレッドについて規定がないので、実装に迷う。

Component 用と銘打ってはあるが、新しい Implementing the Asynchronous Pattern for Components では event を中心とした新しいモデルを提供している。Event のスレッドについても、.NET 2.0 で新しく導入された AsyncOperation と AsyncOperationManager を使って上げろ、と書いている。

この AsyncOperation は、これも .NET 2.0 で新しく導入された SynchronizationContext を使って同期を図る。

SynchronizationContext は、Windows Forms 環境内では Control.Invoke を使い、それ以外では ThreadPool を使って Send/Post の概念を実装する。.NET 1.x における ISynchronizationObject は、インターフェースとして仮想化されているとは言え、実質 Windows Forms 以外の実装がなかったので、一歩進んだと言えそう。Avalon を睨み、message queue を一段隠蔽したのか、という気もするが、Avalon でも message queue は完全には消えないので不明。

AsyncOperation では SynchronizationContext の Post しか利用できないので、event を上げておいてその event handler の処理が終わってから何かすることができない、というのがちょっと使いにくい。その場合には SynchronizationContext を直接使え、ということか。

| | Comments (2) | TrackBack (0)

2005.08.15

new EventHandler

Delegate の調査 ついでに長年の疑問を調べてみる気になった。

Handler += new EventHandler(OnEvent);
Handler -= new EventHandler(OnEvent);

それぞれ new しているのでちょっと不思議な感じだが、実際にはこれで追加した event handler が削除される。

文法としては new でも中でちょっと違うことをやっているのかと思っていたが、IL を見てみると、普通に newobj している。Delegate クラスが Equals メソッドを実装して、その内容で比較するからこのコードで動くのだろう。しかし

EventHandler h = new new EventHandler(OnEvent);
Handler += h;
Handler -= h

これだと newobj は 1 つになるので、ヒープにはちょっと優しい。でも個人的意見かもしれないが、readability が悪い。

これくらいコンパイラが最適化してくれればいいのに、と思うが、VS 2005 Beta 2 で Release ビルドしても最適化はされない。Readability を落としてでも取るほどのメリットではないと思うので、これからも上の書き方をすると思うが、多用する時にはちょっと気持ちが悪いかも。

| | Comments (1652) | TrackBack (0)

Delegate の誤解 : 複数回の追加

delegate に複数回同じ event handler を追加しても無視される、と何かで読んだ気がしてずっとそう思っていましたが、.NET 2.0 で違う挙動に出会い、改めて調べたら、.NET 1.x でも追加した回数だけ呼ばれることが判明。やっぱり疑問はきちんと自分で解いておかないとだめだと反省。

class Program {
	static event EventHandler Handler;

	static void Main(string[] args) {
		Handler += new EventHandler(OnEvent);
		Handler += new EventHandler(OnEvent);
		Dump();
	}

	static void Dump() {
		if (Handler == null) {
			Console.WriteLine("Empty");
			return;
		}
		Console.WriteLine("# Handlers={0}",
			Handler.GetInvocationList().
			Length);
		Handler(null, EventArgs.Empty);
	}

	static void OnEvent(object sender, EventArgs e) {
		Console.WriteLine("OnEvent");
	}
}

結果は

# Handlers=2
OnEvent
OnEvent

しっかり 2 回呼ばれてしまいました。こう書けば安全か。

Handler -= new EventHandler(OnEvent);
Handler += new EventHandler(OnEvent);

| | Comments (1) | TrackBack (1)

2005.08.13

CLR Spy

違った。ほしかったのは CLRSpy の .NET 2.0 版。Interop が多いので、probe になるかと思ったのですが、こちらは 2.0 対応はまだでした。残念。

| | Comments (2) | TrackBack (0)

CLRProfile Beta 2 Version

CLRProfiler の Beta 2 version が出ている模様。元の CLRProfiler が .NET 2.0 で動かずちょっと残念、とか思っていたのですが、download サイトで検索しても出てこないのにこの URL をたたくとダウンロードできる。

なぞ。でも動くからいいか。

| | Comments (0) | TrackBack (0)

MCE Keyboard

MCE 用のキーボード、いいなあ。日本でも出るんでしょうか。

TECRA M4 といい、最近英語キーボードに切り替えるといいことが歩きが擦る日が多くなってきている。

昔は、やっぱり TECRA を使いたくてしばらく英語キーボードだったのだが、コンシューマ アプリケーションを開発する身として、ユーザーと違うキーボードでは同じ問題を体感できないかも、とわざわざ日本語キーボードに切り替えたのだが、今の仕事はそれほどシリアスになる必要もないか、とも思いつつ、しかし使っているキーボードを全部切り替えるのも面倒で。。。

| | Comments (0) | TrackBack (1)

2005.08.01

WinFX Beta 1

WinFX Beta 1, WinFX Beta 1 SDK も出ていますね。う~ん、この忙しいタイミングで。。。

| | Comments (2) | TrackBack (0)

Windows Longhorn Professional Edition Beta 1

MSDN にもう掲載されました。8/3 と言われていましたが、ちょっとフライング? とりあえずダウンロードをかけて、入れて見ます。

| | Comments (1) | TrackBack (0)

« July 2005 | Main | September 2005 »