C# Thread.Sleep()不';不能在应用程序控制台C中工作#

C# Thread.Sleep()不';不能在应用程序控制台C中工作#,c#,timeout,console-application,C#,Timeout,Console Application,嗨 在C#中,我开发了一个将%CPU(已使用)和RAM直接写入csv文件的代码 它的工作没有延迟,但我想每20秒写一次这个值,这就是为什么我需要使用Thread.Sleep(20000)。 我也尝试过Task.Delay,我也遇到了同样的问题。问题不在于线程。Sleep()。您正在使用StreamWriter,并且由于您的程序可能永远不会关闭,因此您需要在编写之后刷新StreamWriter 加 线程之前的myWriter.Flush().Sleep() 问题是如果我添加了Thread.Slee

在C#中,我开发了一个将%CPU(已使用)和RAM直接写入csv文件的代码

它的工作没有延迟,但我想每20秒写一次这个值,这就是为什么我需要使用Thread.Sleep(20000)。
我也尝试过Task.Delay,我也遇到了同样的问题。

问题不在于线程。Sleep()。您正在使用StreamWriter,并且由于您的程序可能永远不会关闭,因此您需要在编写之后刷新StreamWriter

线程之前的myWriter.Flush().Sleep()

问题是如果我添加了Thread.Sleep(),程序将在csv文件中写入任何内容

(我假设其中缺少一个“不”)

这听起来像是一个冲洗问题;您的更改仍在写入程序中缓冲。您可以尝试使用
myWriter.Flush(),但请注意,共享文件访问等可能仍然会出现问题。由于您将暂停20秒(对计算机来说是很长的时间),因此您最好在不使用文件时将其关闭。如果完全摆脱编写器,只需根据需要使用
File.AppendText(path,newLine)
,注意在字符串中包含您选择的行尾,效果会更好。然后,该文件将几乎一直关闭


另外:您的循环退出条件需要注意;现在它将永远不会自行选择退出(因为
actualPeriod
包括秒,而
DATETIME\u STOP\u RECORD
不包括秒)。最好使用
DateTime
什么是“不起作用”和“问题就在这里”的意思?会发生什么?你期望会发生什么?不相关,但我发现它不太可能存在,因为
=比较字符串;在我看来,您应该将
实际周期
作为
日期时间
保存,并使用
DateTime\u STOP\u记录
不包括秒,但
实际周期
包含秒。所以这将永远循环。另外,根据您当前的文化背景,
-
/
之间可能存在差异。最好的办法是听Marc的话,然后比较一下DateTime,Marc Gravell是对的。。比较
“dd/MM/yy HH:MM:ss”
“01-04-15 17:18”
会让你陷入一个无限循环…@Ironboy07这听起来就像是一个冲水问题。。。您是否尝试过使用
File.AppendText
而不是让编写器保持打开状态?非常好!谢谢你的帮助,不用客气。检查您的while循环,正如其他人所提到的,它看起来是无限的,请检查我的答案。:-)好的,我去看看。谢谢,太好了,它能用!谢谢你的解释。好的,我也会改变我的循环。我现在明白它是怎么工作的了
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
        }

    }


}`