C# C后台工作人员和Streamwriter

C# C后台工作人员和Streamwriter,c#,asynchronous,backgroundworker,streamwriter,C#,Asynchronous,Backgroundworker,Streamwriter,我与BackgroundWorker在将字符串写入/读取文件时遇到问题 但我不知道它在哪里 当我在应用程序上单击“开始”时,我正在检查文件中是否有第一行: StreamWriter writeToCsv; public string filename; public bool canAcces = false; public bool enteteExiste = false; private void start_Click(object sender, EventArgs e)

我与BackgroundWorker在将字符串写入/读取文件时遇到问题 但我不知道它在哪里

当我在应用程序上单击“开始”时,我正在检查文件中是否有第一行:

StreamWriter writeToCsv;
public string filename;
public bool canAcces = false;
public bool enteteExiste = false;

private void start_Click(object sender, EventArgs e)
        {
            filename = filename_box.Text;
            if (filename_valid(filename) == false)
            {
                MessageBox.Show("Nom du fichier incorrect \n Seuls les caractères propre a Windows sont autorisés \n Le fichier doit se terminer par .csv");
            }


            //DEMARRAGE DE LA PROCEDURE
            boxLogs.Clear();
            if (filename_valid(filename))
            {
                try
                {
                    verifieEntete();
                    //INSERTION DE L'ENTETE DU FICHIER CSV
                    writeToCsv = new StreamWriter(boxFilePath.Text + "\\" + filename, true);
                    canAcces = true;
                }
            }
        }
此任务是同步完成的。这是程序要做的第一件事。 函数VerifieEvente正在更改布尔值enteteExiste

public void verifieEntete()
        {
             string absolutFilePath = boxFilePath.Text + '\\' + filename;
             if (!File.Exists(absolutFilePath))
             {
                 File.Create(absolutFilePath).Close();

             }
                String[] fileContent = File.ReadAllText(absolutFilePath).Split(',');
                for (int i = 0; i < fileContent.Length; i++)
                    if (fileContent[i].Contains("MAC;SERIAL;IP;MODELE;MODULE-EXT;NUM-COURT;SITE"))
                        enteteExiste = true;          
        }
在我的bw_DoWork函数中,以下是第一行:

public void bw_DoWork(object sender, DoWorkEventArgs e)
{
    countPlages = listePlages.Items.Count;
        if (countPlages != 0 && boxFilePath.Text != "" && canAcces == true && filename_valid(filename))
        {
            tableauPlages = new string[countPlages, 2];
            if (enteteExiste == false)
            {
                writeToCsv.WriteLine("MAC;SERIAL;IP;MODELE;MODULE-EXT;NUM-COURT;SITE");
            }
        }
}
问题是: 程序运行时,创建文件(如果不存在),然后应在其中放置第一行:

writeToCsv.WriteLine("MAC;SERIAL;IP;MODELE;MODULE-EXT;NUM-COURT;SITE");
但是相反,程序创建文件,但不在其中放入任何内容。甚至最糟糕的是,这个计划并没有结束。好像它在这条写线上循环,但从不写

在那之后,我有很多其他指令,但我可以看到没有一条指令被执行。
后台工作人员和Streamwriter有什么问题?

一般来说,最好在完成Streamwriter后关闭并处理它:

using (var writer = new StreamWriter(boxFilePath.Text + "\\" + filename, true))
{
    canAcces = true;
}
在写入实际数据时重新打开新的StreamWriter

if (enteteExiste == false)
{
    using (var writer = new StreamWriter(boxFilePath.Text + "\\" + filename, true))
    {
        writer.WriteLine("MAC;SERIAL;IP;MODELE;MODULE-EXT;NUM-COURT;SITE");
    }
}
如果不进行处置,文件句柄将保持打开状态,这可能导致难以调试的问题,特别是在多线程环境中

如果性能是这种方法的一个问题,考虑将数据写入缓冲区并以较长的间隔将缓冲区写入文件。


我认为这会有所帮助。

在调试器中,在bw_doWork中设置一个断点,并检查所有内容的状态是否符合您的预期:使用并发活动和无锁定,您的状态可能很容易出错。因此,在进一步的代码中,我还有一些其他块,我正在使用writeToCsv变量编写。每次使用Writer编写之前,我都必须使用using语句声明它?是的,除非您真正知道自己在做什么。StreamWriter有一个IDisposable接口,用于释放文件句柄等非托管资源。不这样做可能会导致意外错误。using语句隐式调用此Dispose函数。IDisposable接口通常添加到流、数据库上下文、GDI/图形对象、图像等。有关详细信息,请参阅。
if (enteteExiste == false)
{
    using (var writer = new StreamWriter(boxFilePath.Text + "\\" + filename, true))
    {
        writer.WriteLine("MAC;SERIAL;IP;MODELE;MODULE-EXT;NUM-COURT;SITE");
    }
}