0

HttpWebResponse.BeginGetResponse() メソッドを使用して、サーバーにリクエストを送信します。「リクエスト完了」通知で、次のことを行います (エラー処理コードは含まれていません)。

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

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

私の質問は、response.GetResponseStream() から取得した Stream をメンバー変数としてどこかに保存し、次のようにリクエストをキャンセルしてもよいかどうかです。

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 をスローします。

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

4

2 に答える 2

1

私がいくつかの調査を行った後、私の結論は、ロックを解除する唯一の解決策streamReader.Read()は、キャンセルメソッドにへの呼び出しも含めることですm_requestState.httpRequestStream.Close()(最初の質問で述べたように)。これにより、ObjectDisposedException例外をスローする呼び出しstreamReader.Read()と、実行を終了するための「RequestComplete」通知が行われます。

于 2011-07-15T06:22:48.893 に答える
1

代わりに webRequest を保存し、try catch でキャンセルすることをお勧めします。

    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() が呼び出されないようにします。

于 2011-07-13T17:37:59.107 に答える