3

HttpWebRequest が成功した後、非同期読み取り操作をキャンセル/終了する方法を見つけることができませんでした。タイムアウトを設定する方法はありません。ThreadPool.RegisterWaitForSingleObject も機能していません。また、基になるソケットを閉じることもオプションではありません。これは、HttpWebRequest/Reponse がアクセスを提供しないためです。

編集:

悲しいことに、Sunny が提案するこのアプローチは、HttpWebRequest.BeginGetResponse に対してのみ機能します。何らかの理由で GetResponseStream() の後に取得するストリームの場合、 RegisterWaitForSingleObject が機能していません - コールバックは呼び出されません。

状況は次のとおりです。HttpGetRequest を使用するアプリケーションを入手しました。非同期 httpwebrequest の既定の MSDN の例を使用してビルドされます。応答を得ることは魅力のように機能しています。しかし、まれに、私の httpwebrequest が接続しているサーバーがソケットを閉じるのを忘れることがあります。そのため、BeginRead からの無限読み取りにかかっています。

まれに、他のサーバーが忘れる

4

1 に答える 1

1

RegisterWaitForSingleObject を使用しないのはなぜですか? タイムアウトに使用でき、ハンドラーで request.Abort() を呼び出すことができます。

ここにがあります。ところで、私は過去にこの記事を見つける前に simial アプローチを使用しましたが、それは魅力的に機能しました。

注: 操作の実際の終了は、次の Stream.Read (要求/応答のみが非同期の場合) または Stream.EndRead (読み取りも非同期の場合) で発生します。EndXXXX ハンドラーでスローされた例外をキャプチャする必要があります。

編集: RegisterWaitForSingleObject が呼び出されない場合は、別の問題が発生します。これは、十分な空きスレッドがない ThreadPool である可能性が最も高いです。RegisterWaitForSingle オブジェクトのコールバックは ThreadPool スレッドで呼び出され、プールに空きスレッドがない場合は呼び出されません。いくつかの解決策があります:

  1. ページを非同期にします。なぜですか?どのように。
  2. プールの最大スレッド数を変更します。

いずれにせよ、プール サイズを大きくしてもあまり効果はありません。リソース (ストリーム) リークがないかコードを検査し、request.Abort() を呼び出すだけでなく、応答も閉じるようにする必要があります。コールバックで適切な EndXXX メソッドなどを使用していることを確認してください。

I nazdrave :)

于 2008-11-13T22:00:10.550 に答える