- PR -

MessageQueueにアイテム追加された時のイベントが欲しい

投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-15 03:01
すみません、もうひとつ確認させてください。

引用:

非同期を理解されている前提で話していたのがまずかったようです。



実は自分では非同期は理解していたと思っていました…。「非同期」についての理解を確実にさせて頂きたく、もう一つ質問させてください。

私は「非同期」とは、何らかのメソッドを呼んだのち、その結果を待つことなく別のことが出来るものだと思っていました(処理開始から終了まで時間がかかる時など)。

一般的に「データが存在しない状態で何か非同期メソッドが呼ばれた」場合、2つの振る舞いがありえると思っていました。
1. すぐさま「データないよ」という結果を返す
2. データが存在する状態になるまで何も起こらず、データが現れれば直ちに処理を開始し、処理結果を返す

今回は "BeginReceive"という名前から私は1.だと思いこんでしまったわけで(実際は2.だったのですが)、何とかしてデータの存在を知らないと呼べないじゃん、と思ったわけです。一般に「非同期」と言えば常に2.の動作をするものなのでしょうか?1.はあり得ないのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 08:54
引用:

がらすさんの書き込み (2005-12-15 03:01) より:

1. すぐさま「データないよ」という結果を返す
2. データが存在する状態になるまで何も起こらず、データが現れれば直ちに処理を開始し、処理結果を返す

今回は "BeginReceive"という名前から私は1.だと思いこんでしまったわけで(実際は2.だったのですが)、何とかしてデータの存在を知らないと呼べないじゃん、と思ったわけです。一般に「非同期」と言えば常に2.の動作をするものなのでしょうか?1.はあり得ないのでしょうか?


このあたりは、実装と状況しだいじゃないですか?
受信操作が利用可能な状態であらば、すぐに返します。

それ以外にも返ってくるタイミングもありますよね。
タイムアウト時とか、EndReceive メソッドの時など...

これらは任意に設定できるので、1. か 2. か、という選択肢はおかしい気がします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-15 09:55
すみません、もう一度。

引用:

これらは任意に設定できるので、1. か 2. か、という選択肢はおかしい気がします。



一般的に「非同期なメソッド」で
1. すぐさま「データないよ」という結果を返す
という動作しか出来ないものは存在しない(私は存在すると思ってました)、ということで合ってますか?

「非同期なメソッド」ならば、常に
2. データが存在する状態になるまで何も起こらず、データが現れれば直ちに処理を開始し、処理結果を返す
という動作が出来るように実装されていると考えて良い・考えるべきだ、という理解でよろしいでしょうか。

「非同期なメソッド」と聞いたときに、どこまで期待していいのかを知りたいのです。これまではかなり狭い範囲のことしか期待してなかったので、2.が常に期待できるのならば認識を改めようと思った次第です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 10:27
引用:

がらすさんの書き込み (2005-12-15 09:55) より:

一般的に「非同期なメソッド」で
1. すぐさま「データないよ」という結果を返す
という動作しか出来ないものは存在しない(私は存在すると思ってました)、ということで合ってますか?


うーん、作れば存在することになるでしょう。

引用:

「非同期なメソッド」ならば、常に


うーん、「常」かどうかはわかりません。
作ってしまえば常ではなくなってしまいます。

引用:

「非同期なメソッド」と聞いたときに、どこまで期待していいのかを知りたいのです。
これまではかなり狭い範囲のことしか期待してなかったので、2.が常に期待できるのならば認識を改めようと思った次第です。


一般的に、という意味でなら先の "期待" で合ってると思います。
.NET Framework のようなサービス指向なライブラリって、
がらすさんもそうですが、誰もが期待するような動作をすべきですよね。
(だからこそネーミングも大切なわけで)

そういう意味で、BeginReceive という名前は期待しにくいということでしょうか?

# でも、BeginInvoke メソッドなどの例もあるわけで... (^^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-15 10:55
引用:

じゃんぬねっとさんの書き込み (2005-12-15 10:27) より:

一般的に、という意味でなら先の "期待" で合ってると思います。
.NET Framework のようなサービス指向なライブラリって、
がらすさんもそうですが、誰もが期待するような動作をすべきですよね。



そうですか、分かりました。ありがとうございました。
私は未だ .NET 的な常識というか、暗黙の了解のようなものを良く知らないということでしょうか?

引用:

そういう意味で、BeginReceive という名前は期待しにくいということでしょうか?
# でも、BeginInvoke メソッドなどの例もあるわけで... (^^



BeginInvoke は、どんな状況でも直ぐにInvoke出来ますので、悩む余地はありませんでした(Begin と Invoke の意味の違いを意識することは一般人の生活ではあり得ないでしょうが)。
BeginReceive で、直ぐにReceive出来ない状況での振る舞いは良く分かりませんでした。名前にはその辺の情報は含まれて居ないと思います(名前が悪いと言っているわけではありません)。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 11:06
引用:

がらすさんの書き込み (2005-12-15 10:55) より:

私は未だ .NET 的な常識というか、暗黙の了解のようなものを良く知らないということでしょうか?


いえ、暗黙の了解を知らなくても、予想が付くのがサービス指向だと思います。
そういう意味では .NET Framework の命名が合ってなかったのかもしれません。

引用:

BeginReceive で、直ぐにReceive出来ない状況での振る舞いは良く分かりませんでした。名前にはその辺の情報は含まれて居ないと思います(名前が悪いと言っているわけではありません)。


なるほど、Begin の後に Receive 単体なのがまずいんでしょうね。(^^;)
これだと、Receive を Begin するよ -> じゃあ、データが来たことはいつ読み取るの?
がらすさんが当初考えた方向になりそうですね。

# BeginWaitReceive とかだったとしたら、どう思います?
# でも、実際は受信もしちゃいますからね... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-15 11:28
引用:

じゃんぬねっとさんの書き込み (2005-12-15 11:06) より:

# BeginWaitReceive とかだったとしたら、どう思います?
# でも、実際は受信もしちゃいますからね... orz



WaitReceive とか、BeginReceiveMode などならば誤解しなかったのかもしれません。
ただし、これは私(だけ)の感覚であって、BeginReceiveが悪いと言いたい訳でもありません…。
「非同期メソッドはすべてBeginFoo」という法則はそれでいいとは思うし。
# ビギン フー!
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-12-15 14:08
引用:

今回は "BeginReceive"という名前から私は1.だと思いこんでしまったわけで


私も第一印象ではだまされました。。。

引用:

一般に「非同期」と言えば常に2.の動作をするものなのでしょうか?
1.はあり得ないのでしょうか?


非同期は呼び出しが非同期ということですよね。
Subを呼び出したときに相手のEnd Subを抜けることに関係なく呼び出し元の次のステップが継続される。
がらすさんのおっしゃる動作は呼び出し先の実装のことなのでどういう振る舞いをするかは
その仕様に依存するでしょう。

スキルアップ/キャリアアップ(JOB@IT)