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, и у меня такая же проблема.
Проблема не в Thread.Sleep(). Вы используете StreamWriter, и, поскольку ваша программа, вероятно, никогда не закрывается, вам нужно очистить StreamWriter после записи.
Добавить
myWriter.Flush() перед Thread.Sleep()
Проблема в том, что если я добавлю Thread.Sleep(), программа напишет что-нибудь в файле csv.
(Я предполагаю, что там отсутствует "нет")
Это звучит как проблема смыва; ваши изменения все еще буферизуются в писателе. Вы можете попробовать использовать myWriter.Flush();
, но обратите внимание, что у вас могут возникнуть проблемы с общим доступом к файлам и т.д. Поскольку вы собираетесь приостановить на 20 секунд (очень долгое время на компьютере), вы можете также сохранить файл закрытым, когда вы не используете Это. Было бы более эффективно избавиться от писателя и просто использовать File.AppendText(path, newLine)
мере необходимости, отметив, что вы включили свой выбор окончания строки в строке. Тогда файл будет закрыт почти все время.
Дополнительно: ваше условие выхода цикла требует внимания; сейчас он никогда не выйдет из своего выбора (так как actualPeriod
включает секунды, а DATETIME_STOP_RECORD
- нет). Было бы лучше использовать DateTime
и <
, тоже (вы могли бы перейти от времени до времени, не нажимая ровно столько времени).
!=
; ИМО вы должны держатьactualPeriod
какDateTime
и использовать<