2016-09-22 10 views
-1

次の静的C#タスクはメモリリークを引き起こしますか?このような静的タスクを使用すると、メモリリークが発生する可能性がありますか?

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

GCによって収集されませんResultListへの参照を作成します: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; 
        } 
       } 
      } 
     } 
    } 

を使用していることに注意してください? ResharperのdotMemoryツールを使用してアプリのメモリを検査し、別のページに移動するとResultListに含まれるデータの一部が残っているように見えるため、これを説明します。

答えて

1

いいえ、ここにはメモリリークはありません。タスクは静的メソッドではありません。が返され、静的メソッドからが返されます。空文字列にrootnullまたはjsonに設定する必要もありません。

ここではResultを使用しないでください。代わりにawaitを使用してください。

+0

ああ、ルートまたはjsonをnullに設定することは、それが何かを変更した可能性があるかどうかを判断するばかげたテストに過ぎませんでした。また、私の知らないことは残念ですが、私はC#の初心者です:静的メソッドと静的メソッドから返されたタスクの違いは何ですか? – user2950509

+0

メモリリークの点では、静的な*フィールド*はメモリに残ります。静的メソッドは、関数のようなクラスを含むインスタンスを持たずに呼び出せるメソッドです。静的クラスは、静的メンバーのみを含むことができるクラスです。 –

関連する問題