繁体   English   中英

C#BackgroundWorker和Streamwriter

[英]C# BackgroundWorker and Streamwriter

我在使用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上循环,但是永远不要编写它。

在那之后,我还有其他许多指令,但是我可以看到没有任何指令被执行。 后台工作者和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");
    }
}

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

如果此方法存在性能问题,请考虑将数据写入缓冲区,然后以较长的间隔将该缓冲区写入文件。

我认为这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM