- - PR -
MessageQueueにアイテム追加された時のイベントが欲しい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-15 03:01
すみません、もうひとつ確認させてください。
実は自分では非同期は理解していたと思っていました…。「非同期」についての理解を確実にさせて頂きたく、もう一つ質問させてください。 私は「非同期」とは、何らかのメソッドを呼んだのち、その結果を待つことなく別のことが出来るものだと思っていました(処理開始から終了まで時間がかかる時など)。 一般的に「データが存在しない状態で何か非同期メソッドが呼ばれた」場合、2つの振る舞いがありえると思っていました。 1. すぐさま「データないよ」という結果を返す 2. データが存在する状態になるまで何も起こらず、データが現れれば直ちに処理を開始し、処理結果を返す 今回は "BeginReceive"という名前から私は1.だと思いこんでしまったわけで(実際は2.だったのですが)、何とかしてデータの存在を知らないと呼べないじゃん、と思ったわけです。一般に「非同期」と言えば常に2.の動作をするものなのでしょうか?1.はあり得ないのでしょうか? | ||||||||||||
|
投稿日時: 2005-12-15 08:54
このあたりは、実装と状況しだいじゃないですか? 受信操作が利用可能な状態であらば、すぐに返します。 それ以外にも返ってくるタイミングもありますよね。 タイムアウト時とか、EndReceive メソッドの時など... これらは任意に設定できるので、1. か 2. か、という選択肢はおかしい気がします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-15 09:55
すみません、もう一度。
一般的に「非同期なメソッド」で 1. すぐさま「データないよ」という結果を返す という動作しか出来ないものは存在しない(私は存在すると思ってました)、ということで合ってますか? 「非同期なメソッド」ならば、常に 2. データが存在する状態になるまで何も起こらず、データが現れれば直ちに処理を開始し、処理結果を返す という動作が出来るように実装されていると考えて良い・考えるべきだ、という理解でよろしいでしょうか。 「非同期なメソッド」と聞いたときに、どこまで期待していいのかを知りたいのです。これまではかなり狭い範囲のことしか期待してなかったので、2.が常に期待できるのならば認識を改めようと思った次第です。 | ||||||||||||
|
投稿日時: 2005-12-15 10:27
うーん、作れば存在することになるでしょう。
うーん、「常」かどうかはわかりません。 作ってしまえば常ではなくなってしまいます。
一般的に、という意味でなら先の "期待" で合ってると思います。 .NET Framework のようなサービス指向なライブラリって、 がらすさんもそうですが、誰もが期待するような動作をすべきですよね。 (だからこそネーミングも大切なわけで) そういう意味で、BeginReceive という名前は期待しにくいということでしょうか? # でも、BeginInvoke メソッドなどの例もあるわけで... (^^;) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-15 10:55
そうですか、分かりました。ありがとうございました。 私は未だ .NET 的な常識というか、暗黙の了解のようなものを良く知らないということでしょうか?
BeginInvoke は、どんな状況でも直ぐにInvoke出来ますので、悩む余地はありませんでした(Begin と Invoke の意味の違いを意識することは一般人の生活ではあり得ないでしょうが)。 BeginReceive で、直ぐにReceive出来ない状況での振る舞いは良く分かりませんでした。名前にはその辺の情報は含まれて居ないと思います(名前が悪いと言っているわけではありません)。 | ||||||||||||
|
投稿日時: 2005-12-15 11:06
いえ、暗黙の了解を知らなくても、予想が付くのがサービス指向だと思います。 そういう意味では .NET Framework の命名が合ってなかったのかもしれません。
なるほど、Begin の後に Receive 単体なのがまずいんでしょうね。(^^;) これだと、Receive を Begin するよ -> じゃあ、データが来たことはいつ読み取るの? がらすさんが当初考えた方向になりそうですね。 # BeginWaitReceive とかだったとしたら、どう思います? # でも、実際は受信もしちゃいますからね... orz _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-15 11:28
WaitReceive とか、BeginReceiveMode などならば誤解しなかったのかもしれません。 ただし、これは私(だけ)の感覚であって、BeginReceiveが悪いと言いたい訳でもありません…。 「非同期メソッドはすべてBeginFoo」という法則はそれでいいとは思うし。 # ビギン フー! | ||||||||||||
|
投稿日時: 2005-12-15 14:08
私も第一印象ではだまされました。。。
非同期は呼び出しが非同期ということですよね。 Subを呼び出したときに相手のEnd Subを抜けることに関係なく呼び出し元の次のステップが継続される。 がらすさんのおっしゃる動作は呼び出し先の実装のことなのでどういう振る舞いをするかは その仕様に依存するでしょう。 |