質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

1931閲覧

VB.netのWebRequestでメモリが解放されない

YuzuruMorimoto

総合スコア7

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/12/21 12:21

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


Imports System.Net
Imports System.IO
Imports System.

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 を使わずにメモリを解放する方法はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/21 23:23

わんくま同盟の掲示板にマルチポストしてませんか?
guest

回答2

0

ベストアンサー

質問者さんのコードがそのまま動かせないので、下記コードにて実験しました

VB.NET

1Imports System.Net 2Imports System.IO 3Imports System.Xml 4 5Public Class Form1 6 7 Dim NowMemory, MaxMemoey As Long 8 Dim Count, MaxCount As Long 9 Dim ViewText As String 10 11 Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 12 Dim timer1 As New Timer With {.Interval = 100, .Enabled = True} 13 AddHandler timer1.Tick, Sub() 14 Me.Text = ViewText 15 End Sub 16 Await Task.Run(Sub() 17 While True 18 TestProc() 19 20 NowMemory = Environment.WorkingSet 21 Count += 1 22 If MaxMemoey < NowMemory Then 23 MaxCount = Count 24 MaxMemoey = NowMemory 25 End If 26 ViewText = $"{Count}回目 使用メモリ = {NowMemory:N0}byte / 最大 {MaxCount}回目 {MaxMemoey:N0}byte" 27 End While 28 End Sub) 29 30 End Sub 31 32 Private Sub TestProc() 33 Dim request As WebRequest = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ") 34 request.Method = "POST" 35 Dim postData As String = "This is a test that posts this string to a Web server." 36 Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(postData) 37 request.ContentType = "application/x-www-form-urlencoded" 38 request.ContentLength = byteArray.Length 39 Using dataStream As Stream = request.GetRequestStream() 40 dataStream.Write(byteArray, 0, byteArray.Length) 41 dataStream.Close() 42 End Using 43 44 ' Get the response. 45 Using response As WebResponse = request.GetResponse() 46 Using dataStream = response.GetResponseStream() 47 Using reader As New XmlTextReader(dataStream) 48 '処理 49 50 End Using 51 End Using 52 End Using 53 54 End Sub 55 56End Class 57

結果、起動当初からしばらくメモリは増え続けましたが、ある程度で増加はストップし、増加し続けるという現象は確認できませんでした。

また、質問者さんのようなレスポンスの取得コードにて実行してみましたが、変化は見られませんでした。

投稿2018/12/22 03:36

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2018/12/22 05:10

私もVisual Studioのメモリプロファイラーを使って、GC.Collectを実行しない場合とした場合を比べてみましたが、違いは感じられませんでした。
guest

0

解放されないオブジェクトのDisposeメソッドを実行するのはどうでしょうか?

投稿2018/12/21 14:45

firstlast

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuzuruMorimoto

2018/12/21 14:49

Imports System.Net Imports System.IO Imports System. 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) 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 End Sub というように全て入れても解放されません。。。 なにか見落としているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問