Добавляем ссылку на библиотеку ввода-вывода
using System.IO;
название файла логирования
readonly static string sLogFile = "mathpanel.log";
метод для логирования в файл
/// <summary>
/// write to log-file
/// </summary>
public static void Log(string s)
{
try
{
StreamWriter sw = new StreamWriter(sLogFile, true, Encoding.UTF8);
sw.WriteLine(string.Format("{0:yyyy-MM-dd HH:mm:ss} {1}", DateTime.Now, s));
sw.Close();
}
catch (Exception se)
{
MessageBox.Show(se.ToString());
}
}
Здесь мы открываем поток для записи в файл с добавление к имеющемуся содержимому (второй параметр конструктора StreamWriter - true), записываем в него строку с добавленной меткой времени и сохраняем в файл. При работе с файлами возникают исключения. Для их перехвата используем try/catch блок.
В обработчик кнопки добавляем вызов
Log("Не готово");
Запускаем программу, нажимаем на кнопку, в текущей папке появился файл «mathpanel.log», в котором записано
2021-09-09 14:13:57 Не готово
Добавим еще один метод для вывода сообщений в нижнем окне программы. Мы планируем вызывать его не только из потока пользовательского интерфейса. Поэтому создаем новые переменные dispObj, bReady, txtConsole, txtCommand
static System.Windows.Threading.Dispatcher dispObj; //диспетчер UI-потока, через него обращения к элементам UI из других потоков
static bool bReady = true; //признак успешной инициализации
static TextBox txtConsole, txtCommand; //окна сообщений и комманд
Инициируем их в конструкторе
dispObj = Dispatcher;
txtCommand = textBlock1;
txtConsole = textBlock2;
bReady = true;
Создаем вспомогательный метод Console.
//запускаем циклические процессы в отдельном потоке
//чтобы обновлять интерфейс пользователя, используем запуск кода в UI
/// <summary>
/// добавить текст в окно сообщений
/// </summary>
/// <param name="s">текст</param>
public static void Console(string s, bool bNewLine = true)
{
//txtConsole.Text += (s + "\r\n");
if (!bReady || dispObj.HasShutdownStarted) return;
//мы запускаем код в UI потоке
dispObj.Invoke(delegate
{
if (bReady) txtConsole.Text += (s + (bNewLine ? "\r\n" : ""));
});
}