Добавляем ссылку на библиотеку ввода-вывода

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" : ""));

            });

        }