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有什么问题?
一般来说,最好关闭并处理您的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,文件句柄将保持打开状态,这可能导致难以调试的问题,特别是在多线程环境中。
如果性能是这种方法的问题,请考虑将数据写入缓冲区,并以较长的间隔将该缓冲区写入文件。