Thread.Sleep() 在应用程序控制台 C# 中不起作用
Thread.Sleep() doesn't work in application Console C#
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
}
}
}`
嗨,
我在 C# 中遇到 Thread.Sleep 的问题,我开发了一个代码,用于将 % CPU(已使用)和 RAM 直接写入 csv 文件。
它没有延迟地工作,但我想每 20 秒写一次这个值,这就是为什么我需要使用 Thread.Sleep(20000)。
我也试过Task.Delay,我也有同样的问题。
问题不在于 Thread.Sleep( )。您正在使用 StreamWriter,并且由于您的程序可能永远不会关闭,因此您需要在写入后刷新 StreamWriter。
添加
myWriter.Flush( ) 在 Thread.Sleep( )
之前
The problem is if I add the Thread.Sleep() the program write anything in the csv file.
(我假设那里缺少一个 "doesn't")
这听起来像是冲洗问题;您的更改仍在编写器中缓冲。您可以 尝试 使用 myWriter.Flush();
,但请注意您可能仍然会遇到共享文件访问等问题。因为您将暂停 20 秒(很长的时间到计算机),您最好在不使用文件时将其关闭。完全摆脱 writer 并根据需要简单地使用 File.AppendText(path, newLine)
会更有效,注意在字符串中包含您选择的行结束符。然后几乎所有时间都会关闭文件。
另外:你的循环退出条件需要注意;现在它将 never 退出它自己的选择(因为 actualPeriod
包括秒,而 DATETIME_STOP_RECORD
不)。最好也使用 DateTime
和 <
(您可以从时间之前到时间之后,而无需准确地到达时间)。
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
}
}
}`
嗨,
我在 C# 中遇到 Thread.Sleep 的问题,我开发了一个代码,用于将 % CPU(已使用)和 RAM 直接写入 csv 文件。
它没有延迟地工作,但我想每 20 秒写一次这个值,这就是为什么我需要使用 Thread.Sleep(20000)。 我也试过Task.Delay,我也有同样的问题。
问题不在于 Thread.Sleep( )。您正在使用 StreamWriter,并且由于您的程序可能永远不会关闭,因此您需要在写入后刷新 StreamWriter。
添加
myWriter.Flush( ) 在 Thread.Sleep( )
之前The problem is if I add the Thread.Sleep() the program write anything in the csv file.
(我假设那里缺少一个 "doesn't")
这听起来像是冲洗问题;您的更改仍在编写器中缓冲。您可以 尝试 使用 myWriter.Flush();
,但请注意您可能仍然会遇到共享文件访问等问题。因为您将暂停 20 秒(很长的时间到计算机),您最好在不使用文件时将其关闭。完全摆脱 writer 并根据需要简单地使用 File.AppendText(path, newLine)
会更有效,注意在字符串中包含您选择的行结束符。然后几乎所有时间都会关闭文件。
另外:你的循环退出条件需要注意;现在它将 never 退出它自己的选择(因为 actualPeriod
包括秒,而 DATETIME_STOP_RECORD
不)。最好也使用 DateTime
和 <
(您可以从时间之前到时间之后,而无需准确地到达时间)。