簡體   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