2012-05-04 4 views
1

ソケットを使用して私のアプリケーション用のネットワークコードを書いています。私はWindows PC上でライブラリをテストしましたが、非常に高速です。それは、(パケットを送信することを意味するパケットによって、私はストリーミングしているTCPを使用していることを意味している)パケットの多くが小さな時間であるか、またはいくつかの大きなパケットであっても、完全に機能します。MonotouchでThreadPoolスレッド数を増やすには?

コードをiPhoneのテストアプリに移行しました。テストを実行し、素晴らしいスピードをもう一度。 2台の携帯電話間で約3MBで約5MBをWi-Fiで送信します。

Imスレッドプールスレッドで同期Socket.Send()操作を使用し、受信にReceiveAsync()を使用しています。 (私もBeginReceive()スタイルを試しましたが、それは同じように動作します)

しかし、一度私のアプリケーションにコードを移動すると、私は問題に遭遇します。一貫して受信することができます。私は、ホストの電話からデータのいくつかの "パケット"を送信することができますそれは受信側に表示される前に瞬時に、数秒から10分にどこにでもすることができます。私はそれを再現するために何ができるのかを正確に理解しようと数日を過ごしましたが、それは決して同じではありません。

現時点では、スレッドプールのスレッドを使い果たしています私は使用しました

ThreadPool.SetMaxThreads() 

スレッド数を大幅に増やすことはできますが、違いはありません。 SocketAsyncEventArgsで完了したコールバックが操作対象のスレッドを取得できないかのように、そのスレッドだけがそこに座ります。私は自分のコードを見直し、周期的なタスクを実行するループを持つスレッドを必ずしも必要としないものをリファクタリングし、それをタイマに変更しましたが、問題は残ります。

私は文字通りどこでこれを使うべきかわかりません。 ImはMonotouchのバグかもしれないと思っています(その人たちを責めようとしているわけではありません!)。

ネットワークコードは単独でテストされており、正常に動作しているため、どのコードを投稿するべきかわかりません。私は1,000,000回の送受信でそれをテストして、何らかのリークがあったかどうかを確認しましたが、何の問題も見つけられませんでした。

データが受信者に届いているようですが、コールバックが何らかの理由で呼び出されて、時には数分遅れることがあります。

誰も私がなぜこのようなことが起こっているのかを指摘できますか?

ありがとうございます。

+1

プールスレッドの数を増やすことは適切な選択肢ではありません。実際には事態を著しく悪化させたり、システムを完全に停止させたりすることができます(あまりにも多くのメモリがスタックに使用されます)。最初に起こるのは、 'SendAsync'です。 2番目の考えは、必要に応じて少数のライタースレッドによって処理できる発信メッセージのキューを持つことです。ここで何人のクライアントをサポートしていますか? (また、それがバグであればMonoではなくMonoTouchのバグです) –

+0

はい、スレッドが増えている気分は悪い考えでした。私は明日、SendAsyncを使って試してみましょう。問題は実際には送信側ではなく受信側にあると私は思う。送信は正常に完了しますが、受信にはコールバックに数分(または数秒)かかる場合があります。クライアントに関しては、私はおそらくそれを10 - 12の最大クライアントに限定することになります。 – Dermot

+1

が有効になっています( 'Socket。NoDelay')?それをオフにしてみてください(もちろん、小さすぎるパケットを書き込まないようにする必要があります) –

答えて

2

この問題は、GKSessionも初期化されているために発生しました。 Monotouch/Monoのバグで、両方のネットワーク機能が有効になっている必要があるので、これを修正できることを願っています。 GKSessionを無効にするとすぐに、ソケットコードが自由に流れます。

+0

あなたの分析は非常に良いアプローチに従うことが証明されています。 +1 –

+0

これについてbugzilla.xamarin.comにバグをオープンしましたか?そうでない場合は、バグであれば修正してください。 – dalexsoto

+0

はい。バグを示すサンプルアプリケーションと共に提出されました。 – Dermot

関連する問題