C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/06/08 01:13
今まで私生活ネタは全く扱ってこなかったけど、今日はちょいとご報告を。
もう一ヶ月以上経つのですが、実は子供が産まれました。
元気な男の子で、毎日大声でオギャオギャ泣いております。まだ笑ったりはしないのですが、もう見てるだけで和みますw

で、その関係で今までほど PC と睨めっこしていられなくなりました。代わりに子供と睨めっこです ^^;

このブログの更新頻度も落ちています。前に言ってたホームページ作成の件も完全に中断しています。こちらの記事でコメントしてくださった ほにゃさん ( そして、いるかどうかはわかりませんが、他にも期待してくださっていた方 ) には本当に申し訳ないです。

思えば、リフレクション入門用の記事も2回でストップしてます。リフレクションで検索してここに飛んでくる方もけっこういらっしゃいますが、ホントすみません。。。

これからは、ブログの更新もあまりできないかもしれませんが、やめるつもりはありません。今後とも、よろしくお願いいたします m(_ _)m
タグ:


ご出産おめでとうございます♪

2007.06.15 11:01 URL | かるび #- [ 編集 ]


かるびさん、お祝いのお言葉ありがとうございます
拍手してくださった方々、ありがとうございます
ホント、嬉しいです (TдT)


この記事を書いた後から今までの間に、2回程記事を書きました
今後は、この2つの記事のように、ちょっとしたことでも色々と取り上げて行こうと思います
そうすればそれなりに更新して行くことができそうです^^

2007.06.16 21:16 URL | よこけん #Ay6tTHf6 [ 編集 ]


うわゎゎゎあぁぁあぁぁぁぁ、名前まで書いてもらっているのにコメントができなくてかなりすいませんです。
よこけん師匠の記事を熟読して一通りのWCFサービスのライブラリを試作した後、動作テストや周辺プログラムの作成に埋没していました。
お子様のお誕生ほんとにおめでとうございます。v-205

以下、いろいろ動かしてみての話です。
netTcpBindingでサービスを利用する場合、クライアントの通信ポートが通信毎にボコボコ増えていく現象に遭遇しまして、(今まで.NET Remotingも経験がなかったもので)どうもOSのNetTcpPortSharingService
を使用していないかららしい(←かなり怪しい調べ方)ということでこのサービスを有効にして(スクリプト等でWMI経由で有効化できるので、PowerShellでもできるでしょうか)
構成ファイルのportSharingEnabledの属性値をtrueに設定しました。またこのサービスの実体は

\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMSvcHost.exe

みたいでこのexeの構成ファイル(SMSvcHost.exe.config)でポート数の閾値やWCF関連のPC単位で適用できる設定が行えるようです。

http://msdn2.microsoft.com/ja-jp/library/system.servicemodel.activation.configuration(vs.80).aspx

.NET Framework 3.0のドキュメントの日本語化はかなりうれしいですね。
もう少しで英語中毒になるところでした。
ただ、Framework 3.5でWCFにも修正や拡張があるみたいなのでそれらの情報も早く出てきて頂きたいものです。

追記:
実はリフレクション関連の記事も拝見しましたが、WCFとリフレクションを組み合わせて汎用なWCFサービス(アセンブリ名やメソッド名等のメタ情報を扱うサービスメソッド)の実装例なんかどうでしょう?
あとちょっと気になっているのですが、自前でサービスをホストする時は当然ホストアプリのプロセス内でサービスクラスがインスタンス化され実行されるのですが、重たい処理があると複数の要求がこなせませんよね?
IISホストだと気にすることもないのでしょうが・・・自前でマルチスレッド化するんですかね。
ServiceBehaviorAttributeのConcurrencyModeも情報自体が少なく、IISのMTAの動作とはちょっと違うようです。

2007.07.04 14:28 URL | ほにゃ #90LdKUd6 [ 編集 ]


ほにゃさん、お久しぶりです
お祝いのお言葉ありがとうございます^^


> 名前まで書いてもらっているのにコメントができなくてかなりすいませんです。

とんでもない、全く持ってお気になさらないでください。
お祝いのお言葉を頂けて、とても嬉しいです^^


> よこけん師匠の記事を熟読して

師匠とはまた、お世辞にしても持ち上げすぎです(苦笑)
実際、知らないことだらけです^^;


> 以下、いろいろ動かしてみての話です。

大変貴重な情報を提供して頂き、ありがとうございます。
SMSvcHost.exeとは、初耳でした。net.tcpを利用する場合はおさえておく必要がありそうですね!


>Framework 3.5でWCFにも修正や拡張があるみたいなのでそれらの情報も早く出てきて頂きたいものです。

そうですねー、私の場合英語は大の苦手でして、日本語ドキュメントがないとホント困ります;;
(ちなみに、修正はたぶんないと思いますよ。.NET 3.0のクラスライブラリ自体はそのままのはずなので~。)


> WCFとリフレクションを組み合わせて汎用なWCFサービス(アセンブリ名やメソッド名等のメタ情報を扱うサービスメソッド)の実装例なんかどうでしょう?

うーん、サービスを通じてメタデータ関連の処理となると、中々良い例が思い浮かばないですね^^;
ただ、WCFもリフレクションとは密接な関係を持っているようですね。
例えばメタデータのエクスポートなんてリフレクションが無ければ成り立ちません。


> あとちょっと気になっているのですが、自前でサービスをホストする時は当然ホストアプリのプロセス内でサービスクラスがインスタンス化され実行されるのですが、重たい処理があると複数の要求がこなせませんよね?
> IISホストだと気にすることもないのでしょうが・・・自前でマルチスレッド化するんですかね。
> ServiceBehaviorAttributeのConcurrencyModeも情報自体が少なく、IISのMTAの動作とはちょっと違うようです。

「IISのMTAの動作」というのは全然知らないのですが、少なくともWCFのServiceHostクラスが要求を処理する際の動作は、IISホストでもセルフホストでも同じなんじゃないでしょうか?(あくまでも予想です)
ConcurrencyModeについては、そのうち調査して記事を書こうと思っていたのですが、今少し調べてみた所、CurrencyModeは同一インスタンスに対する同時実行の制御を行うようです。
つまり、サービスメソッドの実行中に、異なるクライアントからサービスメソッドが呼び出された場合は、ConcurrencyModeの設定に関わらず、別スレッドで処理されます。
ただし、サービスインスタンスをシングルトンにした場合はCurrencyModeに依存します。
(って、私もしかして的外れなこと言ってます?^^;)

2007.07.05 23:45 URL | よこけん #Ay6tTHf6 [ 編集 ]


こんにちわ。ほにゃです。
お子様は健やかにお育ちでしょうか。v-222

>ちなみに、修正はたぶんないと思いますよ。

せっかく書いたものが、旧形式ですとか言われて波線でいっぱいになったらどうしようかとヒヤヒヤしておりましたので安心しました。

>「IISのMTAの動作」というのは全然知らないのですが
>サービスメソッドの実行中に、異なるクライアントからサービスメソッドが呼び出された場合は(略)別スレッドで処理されます。

いえ、自分もこのような動作を想像していてIISの動作がそういう動作だろうという意味で書きました。

>サービスインスタンスをシングルトンにした場合はCurrencyModeに依存します。

この辺りはたぶん自分のはやとちりかもです。でも下の説明じゃすぐには対象がシングルトンオブジェクトかどうかわかりにくいですよね。v-12
(全然関係ないですが、子供って多重継承のシングルトンオブジェクトですかね?)
http://msdn2.microsoft.com/ja-jp/library/system.servicemodel.concurrencymode(VS.80).aspx

それで自分がマルチスレッドではないと思った理由は二つあってですね。
ひとつは異なるクライアントで同一メソッドを呼び出した場合にそれぞれのメソッド中でホストアプリのコントロールが操作できたんですね。
スレッドが異なれば普通Invokeなしには触れないと思いますのでスレッドが別でないかそれを意識しないでよいほどWCFがすばらしいかのどち
らかだと。(でも意識させないってある意味怖いような・・スレッドセーフを考えないですよね)
もうひとつは実際に意図的に負荷を高くしたサービスメソッドをマルチコアのCPUで動作させた場合にCPUの使用率が上がらなかったからです。
(シングルスレッド動作時に見られる各CPUの使用率が平均)
サービスメソッドを自力でマルチスレッド化して実行すると単独のCPUの使用率が100%近くになりました。
(InstanceContextMode:=InstanceContextMode.PerSession, ConcurrencyMode:=ConcurrencyMode.Singleです。Multiでも同様)

>ConcurrencyModeについては、そのうち調査して記事を書こうと思っていたのですが

正座してお待ちしていてよろしいでしょうか。
(ウソです。お暇な時にでもよろしくお願いします。)

2007.07.06 16:44 URL | ほにゃ #90LdKUd6 [ 編集 ]


ほにゃさんこんばんわ^^
子供は元気に育ってますよ

> (全然関係ないですが、子供って多重継承のシングルトンオブジェクトですかね?)

私の考えだと、人はあくまでも人クラスですね。
全ての人間は人クラスのインスタンスで、人クラスのインスタンスを生成できるのは人クラスのインスタンスだけです。
人クラスを生成するには、二つの遺伝情報オブジェクトが必要です。


> ひとつは異なるクライアントで同一メソッドを呼び出した場合にそれぞれのメソッド中でホストアプリのコントロールが操作できたんですね。
> スレッドが異なれば普通Invokeなしには触れないと思いますのでスレッドが別でないかそれを意識しないでよいほどWCFがすばらしいかのどちらかだと。(でも意識させないってある意味怖いような・・スレッドセーフを考えないですよね)

確かにサービスからServiceHostにアクセスすることができますが、ServiceHostはスレッドセーフではないでしょうし、スレッドセーフかどうかに関わらず、サービスの実行中にホストを操作するべきではないですね。
ホストの情報取得なら問題ないと思います。


> もうひとつは実際に意図的に負荷を高くしたサービスメソッドをマルチコアのCPUで動作させた場合にCPUの使用率が上がらなかったからです。
> (シングルスレッド動作時に見られる各CPUの使用率が平均)
> サービスメソッドを自力でマルチスレッド化して実行すると単独のCPUの使用率が100%近くになりました。
> (InstanceContextMode:=InstanceContextMode.PerSession, ConcurrencyMode:=ConcurrencyMode.Singleです。Multiでも同様)

すみません、私の理解力が足りないせいなのですが、ちょっと状況が掴めないです。
参考までに、私が確認した方法を記述しますと、以下のようなサービスメソッドを用意し、コンソールアプリでセルフホストしました。

public void Hoge()
{
Thread currentThread = Thread.CurrentThread;
int currentManagedThreadId = currentThread.ManagedThreadId;
Console.WriteLine("Begin Hoge : {0}", currentManagedThreadId);
Thread.Sleep(5000);
Console.WriteLine("End Hoge : {0}", currentManagedThreadId);
}

これを呼び出すクライアントアプリを作成し、2つ以上同時に実行すると、ホストアプリの方に以下のような出力が行われました。

Begin Hoge : 4
Begin Hoge : 6
End Hoge : 4
End Hoge : 6

サービスをシングルトンにしない限り、ConcurrencyModeの設定に関わらず、同じような結果になります。


> 正座してお待ちしていてよろしいでしょうか。
> (ウソです。お暇な時にでもよろしくお願いします。)

すみません、気長に待っていただけると助かります><;

2007.07.08 00:37 URL | よこけん #Ay6tTHf6 [ 編集 ]












トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/134-cc64fe2a