簡體   English   中英

快速增加 Memory 使用量 C#

[英]Rapidly Increasing Memory usage C#

我的代碼基本上從鏈接打開網頁 +.ts 文件並重復它,但問題是它每次都會增加 memory 的使用量,並且從不刪除舊數據。 2 小時后,它使用超過 2GB。 關於如何解決此問題的任何想法?

我正在使用“Leaf.Xnet”庫來處理請求,這就是我創建線程的方式:

new Thread(new ThreadStart(WebHelper.Check)).Start();

主要代碼:

public static void Check()
{
    HttpRequest request = null;

    while (Form1.isRuning)
    {
        Application.DoEvents();

        try
        {
            request = new HttpRequest();
            if (!ProxyManager.updating)
            {
                switch (ProxyManager.curProxyType)
                {
                    case ProxyManager.proxyType.http:
                        request.Proxy = HttpProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.http));
                        break;
                    case ProxyManager.proxyType.socks4:
                        request.Proxy = Socks4ProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.socks4));
                        break;
                    case ProxyManager.proxyType.socks5:
                        request.Proxy = Socks5ProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.socks5));
                        break;
                }
            }
            else
            {
                Thread.Sleep(2000);
                Check();
            }

           request.UserAgentRandomize();
           request.AddHeader(HttpHeader.Referer, "https://somesite.com");
           request.KeepAlive = true;
           request.ConnectTimeout = Form1.timeOut;
           request.Reconnect = true;
           string html = request.Get(Form1.link, null).ToString();
           string auth = html.Substring(",[{\"src\":\"", "\"");
           string sign = html.Substring("144p.apt?wmsAuthSign=", "\"");

           if (auth != null && sign != null)
           {
               string auth2 = "";
               foreach (char item in auth)
               {
                   if (item != '\\')
                       auth2 += item;
               }

               auth = auth2;
               string cdn = auth.Substring("https://", ".");
               string id = auth.Substring("video/", "-");
               if (cdn != null && id != null)
               {
                   Random rnd = new Random();
                   request.Get(auth);
                   Form1.sended++;
                   WriteStat();
               }
               html = null;
               auth = null;
               auth2 = null;
               sign = null;
           }
        }
        catch (HttpException)
        {
            Check();
        }
        catch (ProxyException)
        {
            Check();
        }
    }
}

我不完全確定這是否會解決您的問題,但是對於您啟動的每個線程,您幾乎都會調用Check()的無限次執行。 由於Check包含一個 while 循環,因此線程將永遠運行 side 中的任何內容,現在您在其之上再次調用該方法。 這意味着在Check方法的 scope 中創建的所有內容都不會被垃圾收集,並且會增加您的 memory。

continue替換所有對Check()的調用,這將停止 while 循環中的執行並重新開始。

另外,考慮不使用線程,而是使用任務。

此外,您不處置您的HttpRequest

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM