[英]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.