2016-09-22 25 views
-1

下面的靜態C#任務會導致內存泄漏嗎?請注意,JSON相關的方法是使用Newtonsoft.JSON.Net可以使用這樣的靜態任務導致內存泄漏?

public static async Task<List<Result>> TMDBDiscover(string url) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     using (HttpResponseMessage response = await client.GetAsync(url)) 
      { 
       using (Stream stream = response.Content.ReadAsStreamAsync().Result) 
       { 
        using (StreamReader reader = new StreamReader(stream)) 
        { 
         List<Result> ResultList = new List<Result>(); 
         string json = reader.ReadToEnd(); 
         var root = JsonConvert.DeserializeObject<RootObject>(json); 
         foreach (Result r in root.results) 
         { 
          ResultList.Add(r); 
         } 
         root = null; 
         json = ""; 
         return ResultList; 
        } 
       } 
      } 
     } 
    } 

調用會從頁面這種方法是這樣的:

foreach (Result r in await TMDBDiscover("url")) 
    listview.Items.Add(r) 

創造ResultList參考,不得到由GC回收?我這樣說是因爲我用Resharper的dotMemory工具檢查了應用程序的內存,當我導航到另一個頁面時,ResultList中包含的一些數據似乎被遺留下來。

回答

1

不,這裏沒有內存泄漏。該任務不是靜態的 - 從靜態方法返回的任務是。也沒有必要將root設置爲nulljson爲空字符串。

在附註中,您不應該在這裏使用Result;改爲使用await

+0

哦,是的,關於設置根或JSON爲空,這只是一個愚蠢的測試,找出是否可能改變了任何東西(它沒有)。此外,對我的無知感到抱歉,但我是C#的新手:靜態類和從靜態方法返回的任務有什麼區別? – user2950509

+0

就內存泄漏而言,一個靜態*字段*將留在內存中。靜態方法只是一種方法,你可以調用它而不需要包含它的類的實例,就像函數一樣。靜態類是隻能包含靜態成員的類。 –