C#内存管理(内存泄漏?)

时间:2013-12-20 22:23:43

标签: c# performance visual-studio memory-management

我正在研究WPF中的程序,该程序基本上从WEB API检索JSON数据并解析它然后用EF保存到数据库。

问题是随着时间的推移,程序的内存使用量不断增加。 (从20MB到2g)。

以下是我正在使用的代码。

我是否可以执行任何优化以保持内存不受限制,并说定期删除未使用的对象。

void getMatchInfo_Work(object sender, DoWorkEventArgs e)
    {
        HttpClient client = new HttpClient();
        DataConnection dc = new DataConnection();
        dc.Configuration.AutoDetectChangesEnabled = false;
        dc.Configuration.ValidateOnSaveEnabled = false;



       do{
        do
        {
            using (Stream s = client.GetStreamAsync("http://api.steampowered.com/IDOTA2Match_570/GetMatchHistoryBySequenceNum" +
                "/v1/?key="+devkey+"&start_at_match_seq_num=" + matchseq.ToString()).Result)
            using (StreamReader sr = new StreamReader(s))
            using (JsonReader reader = new JsonTextReader(sr))
            {

                JsonSerializer serializer = new JsonSerializer();
                MatchMain match;
                MatchDesc player;
                RootElement matchSeq = serializer.Deserialize<RootElement>(reader);
                if (matchSeq.result.status == 1)
                {

                    foreach (var m in matchSeq.result.matches)
                    {


                         match = new MatchMain();
                        match.MatchID = m.match_id;
                        match.Win = m.radiant_win;
                        match.Duration = m.duration;


                        match.StartTime = ConvertFromUnixTimestamp(m.start_time);
                        match.TimeStamp = m.start_time;
                        match.SeqNo = m.match_seq_num;
                        matchseq = m.match_seq_num + 1;
                        match.RadTower = m.tower_status_radiant;
                        match.DireTower = m.tower_status_dire;
                        match.RadRax = m.barracks_status_radiant;
                        match.DireRax = m.barracks_status_dire;
                        match.cluster = m.cluster;
                        match.FBTime = m.first_blood_time;
                        match.LobbyType = m.lobby_type;
                        match.HumanCount = m.human_players;
                        match.LeagueID = m.leagueid;
                        match.GameMode = m.game_mode;

                        dc.MatchMain.Add(match);


                        count++;
                        foreach (var p in m.players)
                        {
                             player = new MatchDesc();
                            player.MatchID = m.match_id;
                            player.AccountID = p.account_id;
                            player.PlayerSlot = p.player_slot;
                            player.HeroID = p.hero_id;
                            player.First = p.item_0;
                            player.Second = p.item_1;
                            player.Third = p.item_2;
                            player.Fourth = p.item_3;
                            player.Fifth = p.item_4;
                            player.Sixth = p.item_5;
                            player.Kills = p.kills;
                            player.Deaths = p.deaths;
                            player.Assists = p.assists;
                            player.LeaverStatus = p.leaver_status;
                            player.Gold = p.gold;
                            player.LastHits = p.last_hits;
                            player.Denies = p.denies;
                            player.GPM = p.gold_per_min;
                            player.XPM = p.xp_per_min;
                            player.GoldSpent = p.gold_spent;
                            player.HeroDamage = p.hero_damage;
                            player.TowerDamage = p.tower_damage;
                            player.Healing = p.hero_healing;
                            player.HeroLevel = p.level;

                            dc.MatchDesc.Add(player);



                        }
                        getMatchInfo.ReportProgress(1);
                    }

                    dc.SaveChanges();


                }

                else
                {
                    result = 0;
                }
            }

        } while (result == 1);
        Thread.Sleep(60000);
       }while( result>-999);


    }


void getMatchInfo_Progress(object sender, ProgressChangedEventArgs e)
    {
        if (result != 0)
        {
            txtProgress.Text = count + " matches updated in database and continuing.";

        }
        else
        {
            txtProgress.Text = count + " matches updated in database and waiting for API.";
        }
        txtTime.Text =sw.Elapsed.Hours.ToString()+" hours "+ sw.Elapsed.Minutes.ToString()+" minutes "+
            sw.Elapsed.Seconds.ToString()+" seconds";
    }

编辑:按钮点击代码

  private void btnRetrieveData_Click(object sender, RoutedEventArgs e)
    {



        getMatchInfo.DoWork += new DoWorkEventHandler(getMatchInfo_Work);

        getMatchInfo.ProgressChanged += new ProgressChangedEventHandler(getMatchInfo_Progress);
        getMatchInfo.WorkerReportsProgress = true;
        txtProgress.Text = "Process started";
        matchseq = Convert.ToInt64(txtSeqNo.Text);
        devkey = txtKey.Text;
        sw.Start();
        getMatchInfo.RunWorkerAsync();

    }

1 个答案:

答案 0 :(得分:1)

DataConnection上下文会跟踪它所见过的所有对象。在循环内部创建dc并每次都将其处理掉。在调用每个SaveChanges后,您不需要上下文。

相关问题