Thread.Sleep () не работает в консоли приложения C #

1
class Program
{
    static void Main(string[] args)
    {
        const string PATH = @"C:\My_PATH\";
        const string FILE_NAME = "data_acquistion2";
        const string DATETIME_STOP_RECORD = "01-04-15 17:18";
        bool fichierNonExistant = false;
        PerformanceCounter cpuCounter;
        PerformanceCounter ramCounter;' 

        cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";

        ramCounter = new PerformanceCounter("Memory", "Available MBytes");

        string actualPeriod = "";
        if (!File.Exists(PATH + FILE_NAME + ".csv"))
        {
            FileStream myFs = File.Create(PATH + FILE_NAME + ".csv");
            fichierNonExistant = true;
            myFs.Close();

        }

        StreamWriter myWriter = new StreamWriter(PATH + FILE_NAME + ".csv", true);
        if (fichierNonExistant == true)
        {
            myWriter.WriteLine("CPU Used (%)" + "," + "RAM Free (%)" + "," + "Hour and record Date");
        }

        while (actualPeriod != DATETIME_STOP_RECORD)
        {
            actualPeriod = DateTime.Now.ToString("dd/MM/yy HH:mm:ss");
           // Console.WriteLine(periodeActuelle);
            myWriter.WriteLine(cpuCounter.NextValue() + "," + ramCounter.NextValue() + "," + actualPeriod);
           Thread.Sleep(20000); //If I add this the program doesn't write in the csv file
        }

    }


}'

Здравствуй,

У меня проблема с Thread.Sleep в С#, я разработал код для написания% CPU (используется) и RAM непосредственно в файл csv.

Он работает без задержки, но я хочу писать эти значения каждые 20 секунд, поэтому мне нужно использовать Thread.Sleep(20000). Я также попробовал Task.Delay, и у меня такая же проблема.

  • 0
    что значит «не работает» и «Проблема только здесь» означает? что происходит ? А что ты ожидал ?
  • 2
    несвязанный, но я бы посчитал маловероятным, что он когда-либо выйдет из-за сравнения строк != ; ИМО вы должны держать actualPeriod как DateTime и использовать <
Показать ещё 6 комментариев
Теги:
console-application
timeout

2 ответа

1
Лучший ответ

Проблема не в Thread.Sleep(). Вы используете StreamWriter, и, поскольку ваша программа, вероятно, никогда не закрывается, вам нужно очистить StreamWriter после записи.

Добавить

myWriter.Flush() перед Thread.Sleep()

  • 0
    Отлично, это работает! Спасибо за вашу помощь Shar1er80 :)
  • 0
    Пожалуйста. Проверьте ваш цикл while, как уже упоминали другие, похоже, он бесконечный, и, пожалуйста, проверьте мой ответ. :-)
Показать ещё 1 комментарий
0

Проблема в том, что если я добавлю Thread.Sleep(), программа напишет что-нибудь в файле csv.

(Я предполагаю, что там отсутствует "нет")

Это звучит как проблема смыва; ваши изменения все еще буферизуются в писателе. Вы можете попробовать использовать myWriter.Flush(); , но обратите внимание, что у вас могут возникнуть проблемы с общим доступом к файлам и т.д. Поскольку вы собираетесь приостановить на 20 секунд (очень долгое время на компьютере), вы можете также сохранить файл закрытым, когда вы не используете Это. Было бы более эффективно избавиться от писателя и просто использовать File.AppendText(path, newLine) мере необходимости, отметив, что вы включили свой выбор окончания строки в строке. Тогда файл будет закрыт почти все время.

Дополнительно: ваше условие выхода цикла требует внимания; сейчас он никогда не выйдет из своего выбора (так как actualPeriod включает секунды, а DATETIME_STOP_RECORD - нет). Было бы лучше использовать DateTime и <, тоже (вы могли бы перейти от времени до времени, не нажимая ровно столько времени).

  • 0
    Отлично, это работает! Спасибо за объяснение. Хорошо, я также изменю свой цикл. Теперь я понимаю, как это работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню