2016-09-22 2 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? Я говорю это, потому что я проверил память приложения с помощью инструмента dotMemory от Resharper, и некоторые из данных, содержащихся в ResultList, остаются налево, когда я перехожу на другую страницу.

ответ

1

Нет, утечки памяти здесь нет. Задача не статична - задача вернулась из статического метода. Также нет необходимости устанавливать root на null или json на пустую строку.

На боковой ноте вы не должны использовать здесь Result; вместо этого используйте await.

+0

О да, о настройке root или json на null это был просто глупый тест, чтобы выяснить, могло ли это что-то изменить (это не так). Кроме того, извините за мое невежество, но я довольно новичок на C#: В чем разница между статическим классом и задачей, возвращаемой статическим методом? – user2950509

+0

С точки зрения утечек памяти статическое поле * останется в памяти. Статический метод - это просто метод, который вы можете вызывать без наличия экземпляра его содержащего класса, например функции. Статический класс - это класс, который может содержать только статические члены. –