質問

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

編集:

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

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

まれに、他のサーバーが忘れる場合があります

役に立ちましたか?

解決

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

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

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

EDIT:RegisterWaitForSingleObjectが呼び出されない場合、別の問題があります。これは、おそらく十分な空きスレッドがないThreadPoolです。 RegisterWaitForSingleオブジェクトのコールバックはThreadPoolスレッドで呼び出され、プールに空きスレッドがない場合、呼び出されることはありません。いくつかの解決策があります:

  1. ページを非同期にします。 なぜ方法
  2. プール内の最大スレッド数

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

I nazdrave:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top