Сомнение в оптимизации приложения

Я сделал процесс в c#, который работает все время, проблемы он использует много процентное содержание CPU, кто-то знает, как уменьшать это процентное содержание?

do
            {
                try
                {

                    LogClasifica("Configurando Directorios...");  
                    lector.obtenFiles(fields);
         }
                catch(Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
            while (true);




    public void obtenFiles(string[] field)
    {
        try
        {

            List<string> dirsRaiz = new List<string>(Directory.EnumerateDirectories(field[1]));

            foreach (var dir in dirsRaiz)
            {

                if (dir.Contains(field[21]) || dir.Contains(field[22]) || dir.Contains(field[23]))
                {

                    String dirPath2 = dir;
                    List<string> dirs2 = new List<string>(Directory.EnumerateDirectories(dirPath2));

                    foreach (string dir2 in dirs2)
                    {

                        if (dir2.Contains("AUX"))
                        {
                            //LogClasifica(dir2);
                            int subString2 = Convert.ToInt16(field[45]);
                            string string3 = dir2.Substring(subString2);
                            n = Convert.ToInt16(string3);
                            if (n >= Convert.ToInt16(field[37]) && n <= Convert.ToInt16(field[38])) //CONDICION PARA USESAP
                            {
                                if (dir.Contains(field[21]))
                                {
                                    if (!Directory.Exists(field[10]))
                                    {
                                        Directory.CreateDirectory(field[10]);
                                    }

                                    CopyDirectoryContent2(dir2.Substring(0, subString2) + n, field[10], true);
                                }
                                if (dir.Contains(field[22]) || dir.Contains(field[23]))
                                {
                                    if (!Directory.Exists(field[11]))
                                    {
                                        Directory.CreateDirectory(field[11]);
                                    }
                                    CopyDirectoryContent2(dir2.Substring(0, subString2) + n, field[11], true);
                                }
                            }
                        }
                    }    
                }

            }
        }
        catch (Exception err)
        {
            LogClasifica("Error:" + err.Message + err.StackTrace);
        }

    }
0
задан 09.03.2016, 21:32
2 ответа

У тебя есть несколько проблем, прежде всего construcciГіn cГіdigo.

Для темы выступления одна soluciГіn как та @leandro vendrГ - в добро, и или тебе собиралась предлагать эта

const int WAIT = 1000;//1 seg, pero puede ser menos o mucho menos segun lo que requieras

do
{
   logClasifica("Configurando Directorios...");
   lector.obtenFiles(fields);
   Thread.Sleep(WAIT);
}
while (true);

С этим желания несколько прогресса

  1. ты даешь ему передышку IO особенно из-за написаний к диску, иметь wait loop, который пишет к диску, немедленно - одна ** pГ©sima ** идея
  2. не делай контроль исключений таким большим, лучше манипулируй исключениями, где он был соответствующим в других mГ©todos. управление исключений формы, что это у тебя есть, - слишком дорогое.

, Но.

Ты cГіdigo очень неряшливый, ты recomendarГ, - чтобы герметизировать в корпусе ее lГіgica в одном mГ©todo или различный класс. В общем один mГ©todo такой длинный как тот, который у тебя есть, одна seГ±al, у которого есть слишком большая ответственность, что подразумевает, что не имеешь очень хорошо смоделированная ты soluciГіn.

Класс: ответственность, один mГ©todo ответственность... раскалывает на части, группирует и упорядочивает функциональность.

3
ответ дан 24.11.2019, 14:45

Правда состоит в том, что я вижу мало из-за того, что оптимизирую.

Часть процесса каталогов в методе obtenFiles() очень особенная в логику, в которой ты нуждаешься, он не умел бы говорить тебе, как менять эту часть, не разбираясь в фоне, который ты нуждаешься в том, чтобы реализовать.

, Если я могу упоминать о том, что ты не использовал один do..while, чтобы повторять цикл, осуществляет timer, который он выполнял бы периодически.

Timer t1 = null;

public void Form1_Load(...){

    t1 = new Timer();
    t1.Interval = 1000;
    t1.Tick += t1_Tick;

    t1.Start();

}

public void t1_Tick(...){

    t1.Stop();

    LogClasifica("Configurando Directorios...");  
    lector.obtenFiles(fields);

    t1.Start();
}

Также ты мог бы оценивать бросать процесс в thread (трэде), для того, чтобы он не блокировал приложение. Для этого ты мог бы использовать timer, который находится в System.Threading

Temporizadores субпроцессов (Визуальный C # и Visual Basic)

1
ответ дан 24.11.2019, 14:45