Metrika

20 июля 2011 г.

C#: System.Diagnostics.Process - не срабатывает событие Exited

Для того, что бы срабатывало событие Exited экземпляра класса System.Diagnostics.Process нужно установить свойство EnableRaisingEvents в true. Т.е.:

process.EnableRaisingEvents = true;
process.Exited += new EventHandler(process_Exited);

Распространяется свойство только на событие Exited, т.е. если его не установить в true, то другие события, например OutputDataReceived, будут срабатывать. Описание тут: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.enableraisingevents.aspx

C#: как запустить приложение из кода

Для того, что бы запустить приложение из кода, существует класс System.Diagnostics.Process.
Я запускал консольное приложение через WEB-страницу. То, что консольное приложение выводит в стандартный вывод надо было собирать в лог-файл. Весь код страницы приводить не буду, приведу только ту часть, которая запускает приложение и пишет лог:

private string path_log = "C:\\parser\\"; // Папка, где лежат логи парсера
private string path_ex = "C:\\parser\\log\\"; // Папка, где лежит экзешник парсера
private string file_name = "log.txt"; // Лог-файл
private System.IO.StreamWriter sw_log = null;
private System.Diagnostics.Process parser = null;

private void StartParser()
{
        parser = new Process();
        parser.StartInfo.FileName = path_ex + "parser.exe";
        parser.StartInfo.UseShellExecute = false;
        // Указываем, что будем хватать стандартный вывод
        parser.StartInfo.RedirectStandardOutput = true;
        // А так же кодировку, в которой данные выходят в стандартный вывод
        parser.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
        parser.StartInfo.CreateNoWindow = true;
        parser.StartInfo.WorkingDirectory = path_ex;
        // ВАЖНОЕ СВОЙСТВО!! Без него не будет срабатывать событие parser.Exited
        parser.EnableRaisingEvents = true;
        // Событие, которое срабатывает, когда в стандартный вывод поступает инфа
        parser.OutputDataReceived += new DataReceivedEventHandler(parser_OutputDataReceived);
        parser.Exited += new EventHandler(parser_Exited);
        // ПУСК!
        parser.Start();

        sw_log = new System.IO.StreamWriter(path_log + "\\" + file_name + ".txt");
        // Говорим, что пора ловить данные из стандартного вывода
        parser.BeginOutputReadLine();
        // Возвращаю ID процесса      
        log_content.InnerHtml = string.Format("Parser process ID: {0}", parser.Id);
}

// Пишем стандартный вывод процесса в лог-файл. 
// Я сделал, что бы файл после каждой строчки флашился, мне просто так надо было, не принципиально
private void parser_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
        if (!String.IsNullOrEmpty(e.Data))
        {
            sw_log.WriteLine(e.Data);
            sw_log.Flush();
        }
}

// Закрыаем все и освобождаем
private void parser_Exited(object sender, EventArgs e)
{
        parser.Close();
        parser.Dispose();

        sw_log.Close();
        sw_log.Dispose();
}

В общем все. Из возможно полезного в классе Process есть метод WaitForExit() - который будет ждать, когда запускаемый процесс завершит работу. Так же как стандартный вывод можно ловить инфу из вывода ошибки, для этого есть событие ErrorDataReceived и метод BeginErrorReadLine. Так же там много всякой отладочной инфы по процессу. Подробности тут: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx.

7 июля 2011 г.

ASP.NET: Как файл PrecompiledApp.config влияет на Global.asax

Использую ASP.NET 2.0. При развертывании веб-приложения на сервере (IIS) удалил файл PrecompiledApp.config, т.к. посчитал его не важным. После чего долго удивлялся, почему в файле Global.asax.cs не выполняется метод Application_Start

Здесь обсуждается эта проблема: http://forums.asp.net/t/1694548.aspx/1/10

После того, как положил на сервер файл PrecompiledApp.config все заработало. Не знаю баг это или фича. Вообще, судя по описаниям, файл используется для отслеживания надо ли какие то файлы компилировать при очередном деплое сайта.

6 июля 2011 г.

Ошибка MySQL "data too long" при вставке

При вставке данных в таблицу в поле с типом  blob произошла ошибка "data too long". У меня стоит MySQL 5.5.13 на Windows Server 2008 R2 Standard, винда английская. Погуглив, нашел массу сообщений об этой ошибке и несколько вариантов решения. Мне помогло вот это: http://forums.mysql.com/read.php?103,51906,103853#msg-103853 Надо в my.ini из строки
sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
убрать STRICT_TRANS_TABLES и перезапустить мускул.