C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WebRequestでメモリが解放されない


(過去ログ 154 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■89767 / inTopicNo.1)  WebRequestでメモリが解放されない
  
□投稿者/ もり (1回)-(2018/12/21(Fri) 21:05:33)

分類:[.NET 全般] 

可能でしたら教えていただきたいのですが、、、
VB.netで以下のようなコードを作ってます。

---
Imports System.Net
Imports System.IO
Imports System.Xml

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'リクエストパラメータのセット
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8")
Dim url As String = "****"

Dim req As WebRequest = WebRequest.Create(url)
req.Method = "POST"

Dim res As WebResponse = req.GetResponse()
Dim reader As New XmlTextReader(res.GetResponseStream)

req.Abort()
reader.Close()
res.Close()

End Sub
End Class
---

これを連続で打ち続けます。
しかし、メモリが溜まっていく一方で解放されません。。。

GC.Collect を使わずにメモリを解放する方法はありますでしょうか?
引用返信 編集キー/
■89769 / inTopicNo.2)  Re[1]: WebRequestでメモリが解放されない
□投稿者/ とっちゃん (563回)-(2018/12/21(Fri) 22:14:04)
No89767 (もり さん) に返信

POSTするのに何もデータを渡していないように見えるのはとりあえず置いておくとして。。。
XmlTextReader に渡している res.GetResponseStream が解放されていないように見えます。


かなりおおざっぱな考えですが、原則としてメソッド呼び出しで帰ってくる値の
寿命の管理(解放責任)は、呼び出した側にあります。

その辺を注意しておくと、ぱっと見で怪しいところはどこか?を探しやすいと思いますよ。
引用返信 編集キー/
■89770 / inTopicNo.3)  Re[2]: WebRequestでメモリが解放されない
□投稿者/ もり (2回)-(2018/12/21(Fri) 23:31:24)
No89769 (とっちゃん さん) に返信
> ■No89767 (もり さん) に返信
>
> POSTするのに何もデータを渡していないように見えるのはとりあえず置いておくとして。。。
> XmlTextReader に渡している res.GetResponseStream が解放されていないように見えます。
>
>
> かなりおおざっぱな考えですが、原則としてメソッド呼び出しで帰ってくる値の
> 寿命の管理(解放責任)は、呼び出した側にあります。
>
> その辺を注意しておくと、ぱっと見で怪しいところはどこか?を探しやすいと思いますよ。

ありがとうございます。
アドバイスを元に、すべてのクリア処理を入れたつもりなのですが、解放されません。。

---
'リクエストパラメータのセット
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8")
Dim url As String = "***"

Dim req As WebRequest = WebRequest.Create(url)
req.Method = "POST"

Dim res As WebResponse = req.GetResponse()
Dim reader As New XmlTextReader(res.GetResponseStream)

res.GetResponseStream.Close()
res.GetResponseStream.Dispose()
res.Close()
res.Dispose()
res = Nothing
req.GetResponse.Close()
req.GetResponse.Dispose()
req = Nothing
req = Nothing
reader.Close()
reader.Dispose()
reader = Nothing
---


なにを見落としているのでしょうか・・・
引用返信 編集キー/
■89771 / inTopicNo.4)  Re[3]: WebRequestでメモリが解放されない
□投稿者/ とっちゃん (564回)-(2018/12/22(Sat) 00:54:43)
No89770 (もり さん) に返信
>
> なにを見落としているのでしょうか・・・

書くとしたら以下のような形がよいのではないかと思います。

あえて、違う部分だけ抜粋しています。
何が違っているのかじっくりと考えてみてください。

Using res As WebResponse = req.GetResponse()
Using stream As Stream = res.GetresponseStream()
Using reader As New XmlTextReader( stream )
End Using
End Using
End Using


引用返信 編集キー/
■89772 / inTopicNo.5)  Re[4]: WebRequestでメモリが解放されない
□投稿者/ とっちゃん (565回)-(2018/12/22(Sat) 00:55:41)
あ、図表モードにするの忘れた。。。

ということで、改めて図表モードで張り付け

Using res As WebResponse = req.GetResponse()
  Using stream As Stream = res.GetresponseStream()
    Using reader As New XmlTextReader( stream )
    End Using
  End Using
End Using

引用返信 編集キー/
■89773 / inTopicNo.6)  Re[2]: WebRequestでメモリが解放されない
□投稿者/ 魔界の仮面弁士 (2006回)-(2018/12/22(Sat) 01:28:52)
No89769 (とっちゃん さん) に返信
> POSTするのに何もデータを渡していないように見えるのはとりあえず置いておくとして。。。
> XmlTextReader に渡している res.GetResponseStream が解放されていないように見えます。

XmlTextReader を Close することで、コンストラクタに渡された Stream も Dispose されるはず。


Sub Main()
 Dim ms As New MemoryStream()
 ms.Write(New Byte() {1, 2, 3, 4, 5}, 0, 5)

 Dim xr As New XmlTextReader(ms)
 Console.WriteLine(ms.Length) '「5」
 xr.Close()

 ' ObjectDisposedException「閉じているストリームにアクセスすることはできません。」
 Console.WriteLine(ms.Length)
End Sub
引用返信 編集キー/
■89774 / inTopicNo.7)  Re[3]: WebRequestでメモリが解放されない
□投稿者/ とっちゃん (566回)-(2018/12/22(Sat) 01:37:48)
No89773 (魔界の仮面弁士 さん) に返信
> ■No89769 (とっちゃん さん) に返信
>>POSTするのに何もデータを渡していないように見えるのはとりあえず置いておくとして。。。
>>XmlTextReader に渡している res.GetResponseStream が解放されていないように見えます。
>
> XmlTextReader を Close することで、コンストラクタに渡された Stream も Dispose されるはず。
>
>
> Sub Main()
>  Dim ms As New MemoryStream()
>  ms.Write(New Byte() {1, 2, 3, 4, 5}, 0, 5)
>
>  Dim xr As New XmlTextReader(ms)
>  Console.WriteLine(ms.Length) '「5」
>  xr.Close()
>
>  ' ObjectDisposedException「閉じているストリームにアクセスすることはできません。」
>  Console.WriteLine(ms.Length)
> End Sub

ほぅ。。。
閉じてくれるのか。いつもUsingしてるから、全然気にもかけていなかったw

引用返信 編集キー/
■89775 / inTopicNo.8)  Re[4]: WebRequestでメモリが解放されない
□投稿者/ WebSurfer (1717回)-(2018/12/22(Sat) 17:39:41)
マルチポストのようですので、他のポスト先の URL を貼っておきます。

https://teratail.com/questions/165310

そちらで話は終わっているようです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -