Socket.BeginSend()
メソッドを検討してください。 2つのスレッドプールスレッドが同時にこのメソッドを呼び出すと、それぞれのメッセージが互いに混ざり合うか、ソケットクラスがこれを起こさないようにしますか?ソケットスレッドへの非同期書き込みは安全ですか?
答えて
私はあなたの質問に答えているような賢いpost on the MSDN forumを見つけました。
- 複数のBeginSendを同時にキューに入れることができます。あなたは、ロックする必要はありません
編集:
さらに興味深い情報:
あなたはRemark section of the MSDN doc BeginSend()内のビットをスクロールダウンした場合、あなたはコールバックの興味深い用途が見出されるであろうあなたに関連する可能性のある方法。
[...] BeginSendメソッドを呼び出した後に元のスレッドをブロックする場合は、WaitHandle.WaitOneメソッドを使用します。 [...]
私はこれを知らなかった、ありがとう! – covertCoder
これは私が探していたものです!ありがとう! – Dabloons
.NETソケットインスタンスは、いくつかのメソッド(同じものまたは異なるもの)を同時に呼び出すと、一貫性のない状態が発生する可能性があるため、スレッドセーフではありません。しかし、BeginSend()
およびBeginReceive()
のメソッドは、スレッド自体に対してに対して安全です。
複数の未処理のコールをそれぞれ(またはその両方)呼び出すことは安全です。
BeginReceive()
の場合は、データが呼び出される順番で利用可能になるとサービスされます。これは、処理時間がかかるなど、できるだけ早く他の受信が行われるようにする場合に便利です。もちろん、この場合、複数の領収書を同時に処理するコードがあり、独自の同期ロジックが必要な場合があります。
BeginSend()
の場合、各呼び出しは送信されたデータをソケットバッファにプッシュしようとし、そこで受け入れられるとすぐにコールバックが呼び出されます(EndSend()
と呼ばれます)。呼び出しに必要なバッファ領域が不足していると、ブロックされます。
注:
8Kです:デフォルトの8Kバッファは、以下に該当するとして、「私はすぐに、それはブロックします、正確に8Kのデータを
BeginSend()
を呼び出すことができる」を意味することを想定していません。あなたが通話の8K価値をアップqueingされている「公称サイズ」数、およびバッファが縮小し、ややを育てることが、データが縮小ネットワーク上で送信されることになるというキューイングされたデータの8K
:あなたがスレッド内BeginSend()
複数回呼び出す場合
、あなたは彼らが呼ばれた順番にマシンを残して送信していることが保証されています。
複数のスレッドから
BeginSend()
を呼び出すと、実際の呼び出しが特定の順序で発生するように他のブロックメカニズムを使用しない限り、順序の保証はありません。ただし、各呼び出しは、ネットワークバイトの1つの連続したストリームで適切にデータを送信します。
あなたの答えは最初の質問の数年後に来て、私はちょうどそれを見ています(もう1年後)が、それは素晴らしい詳細を持っていたことを知り、本当に感謝します。しかし、.Netフレームワークの私の個人的な知識と開発者としての私のスキルは今この質問をはるかに過ぎていますが、この答えは将来の読者のための大きなリソースになるでしょう。私が何年も前に正しい答えとして答えをチェックしていなかったなら、あなたに正しい答えを与えるでしょう。とても有難い。 – Dabloons
- 1. Azureへのストリームの非同期書き込みBlobStorage
- 2. MSMQリモートキューへの同期書き込み
- 3. Djangoテスト非同期データベース書き込み
- 4. ElasticSearch Java API非同期書き込み
- 5. RandomAccessFileは非同期で書き込みますか?
- 6. Hazelcast非同期書き込みは推移的ですか?
- 7. スレッドの違い安全で非同期シグナル安全
- 8. 固有ライブラリ:複数の列への書き込みは同時に安全ですか?
- 9. fork()の非同期信号安全性
- 10. ブーストasio非同期の読み取りと書き込み
- 11. PHPファイルの書き込み操作は線形か非同期ですか?
- 12. ファイルを非同期で書き込む
- 13. 同時にMSVCでファイルに非同期で書き込みますか?
- 14. 春の雲カフカストリームに非同期で書き込み
- 15. 並行非同期HTTPポスト:スレッドは安全ですか?
- 16. パラレルマルチスレッド非同期EFコールは安全ですか?
- 17. ファイルの書き込みは非同期で行われますか?
- 18. CeleryはDjangoの非同期ファイル書き込み機能に必要ですか?
- 19. Swift Realm書き込みメソッドが同期スレッドまたは非同期スレッド
- 20. Python用マルチスレッドまたは非同期GTK /ソケットサーバ/データ書き込み
- 21. 同じOpenXmlPartへの書き込みは
- 22. C#変数への安全でないJavaScriptエラーの書き込み
- 23. stringWithContentsOfURLを非同期にする - 安全ですか?
- 24. Mvc完全な非同期スクリプトの読み込み
- 25. 読み取り/書き込み同期
- 26. 非 ".txt"ファイルへの書き込みPython
- 27. インオーダーキューへの非ブロック書き込み
- 28. これらの非同期読み込みメソッドのどれが最適ですか?ドキュメント書き込み?
- 29. スレッドを使用しない非同期DB書き込み
- 30. ノード内の同じファイルに非同期で書き込みして読み込む方法は?
動作しますが、UDPのような信頼性の低い注文データグラムベースのプロトコルでのみ行う必要があります。その理由は、2つのスレッドがBeginSendを呼び出すためにレースしている場合、送信元で順序が乱れることがあります。これにより、TCPを使用しているときにアプリケーションデータが破損する可能性があります。 –