ソケットを使用してアプリのネットワークコードを記述しました。私はWindowsPCでライブラリをテストしましたが、非常に高速です。短時間のデータの多くの小さな「パケット」(送信操作を意味するパケット、ストリーミングであるTCPを使用しています)であろうと、少数の大きなものであろうと、完全に機能します。
コードをiPhone用のテストアプリに移動しました。テストを実行しました、再び素晴らしいスピード。約3秒で2台の電話間で約5MBがwifi経由で送信されます。
スレッドプールスレッドで同期Socket.Send()操作を使用し、受信にReceiveAsync()を使用しています。(BeginReceive()スタイルも試しましたが、同じように動作します。
ただし、コードをアプリに移動すると、問題が発生し始めます。一般的な問題は、受信アプリが一貫して受信していないように見えることです。ホスト電話からいくつかの「パケット」のデータを送信することができ、受信側に表示される前に、瞬時から数秒から10分までのどこにでも送信できます。私はこの問題に2週間(夜/週末)続いており、それを再現するために何ができるかを正確に理解するために何日もテストしてきましたが、2回同じになることはありません。
現時点では、スレッドプールスレッドが使い果たされていることにそれを置いています。私は使用しました
ThreadPool.SetMaxThreads()
スレッド数を大幅に増やしますが、違いはありません。SocketAsyncEventArgsで完了したコールバックが操作するスレッドを取得できないかのように、そこにあるだけです。私は自分のコードを調べて、定期的なタスクを実行するループを持つスレッドを不必要に使用していたものをリファクタリングし、それらをタイマーに変更しましたが、問題は残っています。
私は文字通りこれでどこを向くべきかわかりません。私はそれがMonotouchのバグかもしれないことを望んでいます(私がそれらの人を責めようとしているのではありません!)。
ネットワークコードはそれ自体でテストされており、正常に動作するため、投稿するコードがわかりません。1,000,000の送受信でテストして、何らかのリークがあったかどうかを確認しましたが、問題は見つかりませんでした。
データが受信者に届いているように見えますが、コールバックの呼び出しが大幅に遅れており、場合によっては数分遅れています。
誰かが私にこれが起こっているかもしれない理由の方向を示すことができますか?
ありがとうございました。