запись файла журнала после завершения задания BackgroundWorker

#c#

#c#

Вопрос:

У меня есть приложение на c #, в котором оно отображает сообщение в messagebox после выполнения запроса.В то же время я хочу, чтобы он записал файл журнала. Это то, что я пробовал, но безуспешно. Мой файл журнала был пуст. Он создал пустой файл.

  private void backgroundWorker_Import_DoWork(object sender, DoWorkEventArgs e)
        {
            //Finally, loop through each row in the dataView and execute INSERT Statements against database
            int recCount = 0;
            successCount = 0;
            failedCount = 0;

            dv.RowFilter = "execute_bit IN ('1')";

            using (MySqlConnection connectionMySql = new MySqlConnection(connectionStringMySql))
            {
                connectionMySql.Open();
                MySqlCommand commandMySql = new MySqlCommand();
                commandMySql.Connection = connectionMySql;
                foreach (DataRowView rowView in dv)
                {
                    recCount  ;
                    backgroundWorker_Import.ReportProgress(recCount);
                    commandMySql.CommandText = rowView["sql"].ToString();
                    try
                    {
                        successCount = successCount   commandMySql.ExecuteNonQuery();
                        //WriteToLogFile("");
                        //WriteToLogFile("");
                        **WriteToLogFile(DateTime.Now.ToString()   ", "   recCount.ToString()   ","   successCount.ToString()   ","   failedCount.ToString());
                    }**
                    catch (Exception)
                    {
                        failedCount  ;
                    }   
                }
            }
        }

        private void backgroundWorker_Import_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            string msg = "";
            msg = msg   "Records successfully imported: "   successCount.ToString()   Environment.NewLine;
            msg = msg   "Records that failed to import: "   failedCount.ToString()   Environment.NewLine   Environment.NewLine;
            msg = msg   "Records excluded from import (20 minute grace-period): "   (tblVehicles.Rows.Count - successCount - failedCount).ToString();

            progressBar1.Visible = false;
            MessageBox.Show( msg, "Operation complete", MessageBoxButtons.OK, MessageBoxIcon.Information);


        }
**private void WriteToLogFile(string[] output)
            {
                StreamWriter sw = null;
                FileStream fs = null;
                string logfileFileName = System.IO.Path.Combine( "C:/luvi/logfile.txt");
                fs = File.Open(logfileFileName, FileMode.Append, FileAccess.Write);
                sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
                foreach (string line in output)
                {
                    sw.WriteLine(line);
                }

                sw.Close();
                sw = null;
            }**
 

Комментарии:

1. Успешно ли запущена программа? Вы сталкиваетесь с какими-либо ошибками?

2. БЕЗ ошибок он запускается и отображает окно сообщения с количеством успешных и неудачных записей. Мне нужна та же информация, которая отображается в файле журнала.

3. Рассмотрите инструкцию using при работе с FileStream и StreamWriter.

Ответ №1:

Вы могли бы использовать File.WriteAllLines , как показано в этом разделе.

Его синтаксис выглядит следующим образом:

 public static void WriteAllLines(
     string path,
     string[] contents
)
 

В вашем случае вы бы использовали его следующим образом:

 string logfileFileName = @"C:/luvi/logfile.txt";
File.WriteAllLines(logfileFileName, output);
 

Примечание: при этом файл перезаписывается, если вы хотите добавить его, используйте File .Строки приложения.


Вам также необходимо вызвать свой метод, что может быть проблемой, потому что я не вижу этого в вашем коде. В следующих изменениях я заменил string msg для array и добавил их (вы также можете использовать список и вызвать list.Add).

 private void backgroundWorker_Import_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    string[] msg = new string[] {};
    msg[0] = "Records successfully imported: "   successCount.ToString();
    msg[1] = "Records that failed to import: "   failedCount.ToString();
    msg[2] = "Records excluded from import (20 minute grace-period): "   (tblVehicles.Rows.Count - successCount - failedCount).ToString();

    // Write to log!
    WriteToLogFile(msg);

    // Show to messagebox.
    string showmsg = msg[0]   Environment.NewLine   msg[1]   Environment.NewLine   msg[2];

    progressBar1.Visible = false;
    MessageBox.Show(showmsg, "Operation complete", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

private void WriteToLogFile(string[] output)
{
    string logfileFileName = "C:/luvi/logfile.txt";
    File.AppendAllLines(logfileFileName, output);
}
 

Комментарии:

1. Спасибо Matthijs, но я получил эту ошибку No best type found for implicitly-typed array в строке [] msg = new[] {};

2. Целью вызова было вызвано исключение. — Приложение. Выполнить (новая форма 1());

3. Это в вашей загрузке или конструкторе. Посчитайте этот вопрос решенным и откройте другой, поскольку теперь у вас возникают проблемы, которые не имеют ничего общего с вашим первоначальным вопросом.

4. строка[] msg = новая строка[3].. это сделало работу, спасибо Matthijs.#

5. Рад, что смог помочь! Создание списка вместо использования массива также было бы вариантом, это создает возможность для дополнительной отчетности.

Ответ №2:

кажется, проблема с методом WriteToLogFile(string[] output). Вы передаете одну строку, в то время как она ожидает множество строк. блок catch молча завершает работу.