2011-07-13 4 views
0

私はHttpWebResponse.BeginGetResponse()メソッドを使用して自分のサーバーにリクエストを行います。 「リクエスト完了」の通知では、私は次の操作を行います(エラー処理コードは含まれません):メンバ変数としてどこか)response.GetResponseStream(から取得したStreamを保存するためにOKですし、場合HttpWebResponse.GetResponseStream()を使用して取得したストリームからの読み取りをキャンセルする方法は?

HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result); 
BinaryReader streamReader = new BinaryReader(response.GetResponseStream()); 

while ((readSize = streamReader.Read(buffer, 0, buffer.Length)) > 0) 
{ 
... 
} 

私の質問があります

m_requestState.httpRequest.Abort(); 
m_requestState.httpRequestStream.Close(); // If this is missing then 
// streamReader.Read() locks for a long time when connection is lost. 

このコードは、streamReader.Read()がSystem.ObjectDisposedExceptionをスローするようにします。

ありがとうございました!
ミハイ

答えて

1

、私の結論は、唯一の解決策はstreamReader.Read()もキャンセル方法(最初の質問で述べたように)m_requestState.httpRequestStream.Close()への呼び出しに含めるあるロックを解除することです。これにより、streamReader.Read()にObjectDisposedException例外と「要求完了」通知をスローして実行を終了させます。

1

あなたの代わりにあなたのWebRequestクラスを保存し、トライキャッチでそれをキャンセルした場合、それが最善です:ここ

public void Cancel() 
    { 
     IsCancelled = true; 

     try 
     { 
      if (WebRequest != null) 
      { 
       WebRequest.Abort(); 
      } 
     } 
     catch (Exception ex) 
     { 
      // slicence! 
     } 
    } 

参照WebDownloader helperClassの:

http://www.manorey.net/mohblog/?p=17#content

はIsCancelledフラグが設定されていますcancel()メソッドを呼び出して、Abort()が呼び出された後でもOnComplete()を呼び出さないようにします。私はいくつかの研究をした後

+0

こんにちは、Valipour! IsCancelledに似たフラグがありますが、ストリームからデータを読み込んでいる間に、実行したいキャンセル要求が「要求完了」通知の内側にあるため、これでは不十分です。 「Request Complete」が呼び出されたときに、すべてのデータがローカルで使用できるように、myHttpWebRequest.AllowReadStreamBuffering = falseを使用していることに注意してください。 m_requestState.httpRequestStream.Close()を呼び出さなければ、アプリケーションは破損した接続からそれ以上のデータを読み取ることができないため、streamReader.Read()呼び出しにロックされます。 – Mihai

+0

また、Webリクエストをm_requestState.httpRequestとして保存しています。キャンセル関数でAbortを呼び出します。 'm_requestState.httpRequest.Abort();' – Mihai

関連する問題