C# BackgroundWorker and Streamwriter

本文关键字:Streamwriter and BackgroundWorker | 更新日期: 2023-09-27 18:16:10

我有问题写/读字符串到文件与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;
                }
            }
        }

此任务同步完成。这是程序要做的第一件事。函数"verifieEntete()"正在改变一个布尔值,"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;          
        }

现在,这里是异步部分。我这样做了:

    public void startParListe()
{
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    if (bw.IsBusy != true)
        bw.RunWorkerAsync();
}
在我的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");

但是,程序创建了这个文件,但是没有在里面放任何东西。更糟糕的是,这个项目并没有结束。就好像它在这个WriteLine上循环,但从来没有写过它。

之后还有很多其他的指令,但是我可以看到它们都没有被执行。后台worker和Streamwriter有什么问题?

C# BackgroundWorker and 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");
    }
}

如果不dispose,文件句柄将保持打开状态,这可能导致难以调试的问题,特别是在多线程环境中。

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