Задачка. Как правильно залогировать результат работы
От: Antipod  
Дата: 17.10.07 13:42
Оценка:
Добрый день.

Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).

1. Есть консольное приложение в котором два метода: DoSomething и LogResults.
— LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
— DoSomething может выполняться от нескольких минут до нескольких часов.

2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.
Помогите пожалуйста найти решение для задаичи.
Спасибо
Re: Задачка. Как правильно залогировать результат работы
От: _FRED_ Черногория
Дата: 17.10.07 13:52
Оценка:
Здравствуйте, Antipod, Вы писали:

A>Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).


A>1. Есть консольное приложение в котором два метода: DoSomething и LogResults.

A>- LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
A>- DoSomething может выполняться от нескольких минут до нескольких часов.

A>2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.


Без переделки "консольного приложения" не обойтись.
Самое простое — сбрасывать результат работы на диск время от времени.
Или пускай консольное приложение запускает DoSomething в отдельном потоке и ожидает консольго ввода. Если пришло "Cancel", то прекратить поток, сбросить результат и выйти.
Сложнее — синхронизация по именованному событию.
Ещё сложнее — клиент-сервер через remoting или wcf.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Задачка. Как правильно залогировать результат работы
От: Antipod  
Дата: 17.10.07 14:00
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Antipod, Вы писали:


A>>Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).


A>>1. Есть консольное приложение в котором два метода: DoSomething и LogResults.

A>>- LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
A>>- DoSomething может выполняться от нескольких минут до нескольких часов.

A>>2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.


_FR>Без переделки "консольного приложения" не обойтись.

_FR>Самое простое — сбрасывать результат работы на диск время от времени.
_FR>Или пускай консольное приложение запускает DoSomething в отдельном потоке и ожидает консольго ввода. Если пришло "Cancel", то прекратить поток, сбросить результат и выйти.
_FR>Сложнее — синхронизация по именованному событию.
_FR>Ещё сложнее — клиент-сервер через remoting или wcf.

Спасибо за ответ.

То что консольное приложение нужно будет доделывать я понимаю и готов к этому. При логировании нужно также учесть, что информация о том, что приложение было прерванно тоже нужно залогировать.

Я не совсем понял про вариант когда DoSomething вызывается в отдельном потоке и "ожидает консольного ввода". Если можете, расскажите пожалуйста подробнее суть идеи.

Спасибо.
Re[3]: Задачка. Как правильно залогировать результат работы
От: _FRED_ Черногория
Дата: 17.10.07 14:46
Оценка:
Здравствуйте, Antipod, Вы писали:

A>Я не совсем понял про вариант когда DoSomething вызывается в отдельном потоке и "ожидает консольного ввода". Если можете, расскажите пожалуйста подробнее суть идеи.


Да это я шутки ради придумал а суть простая: DoSomething запускается в отдельном потоке. после этого вызывается Console.ReadLine() если она вернула "Cancel", то поток завершается. Потом вызывается логирование. Другое приложение при запуске первого перенаправляет ввод на себя и по нажатию Stop шлёт в консоль этот самый "Cancel".

Но лучше почитать об именованных объектах.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Help will always be given at Hogwarts to those who ask for it.
Re: Задачка. Как правильно залогировать результат работы
От: ambel-vlad Беларусь  
Дата: 17.10.07 15:03
Оценка:
Здравствуйте, Antipod, Вы писали:

A>Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).


A>1. Есть консольное приложение в котором два метода: DoSomething и LogResults.

A>- LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
A>- DoSomething может выполняться от нескольких минут до нескольких часов.

A>2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.

A>Помогите пожалуйста найти решение для задаичи.

А не поможет ли System.Console.CancelKeyPress в данном случае? В обработчике этого события можно скинуть все логи на диск.
Re[2]: Задачка. Как правильно залогировать результат работы
От: Antipod  
Дата: 17.10.07 15:58
Оценка:
Здравствуйте, ambel-vlad, Вы писали:

AV>Здравствуйте, Antipod, Вы писали:


A>>Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).


A>>1. Есть консольное приложение в котором два метода: DoSomething и LogResults.

A>>- LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
A>>- DoSomething может выполняться от нескольких минут до нескольких часов.

A>>2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.

A>>Помогите пожалуйста найти решение для задаичи.

AV>А не поможет ли System.Console.CancelKeyPress в данном случае? В обработчике этого события можно скинуть все логи на диск.


Спасибо за ответ.

Идея интересная, но как мне тогда из Win приложения отправить уведомление о том, что "нажата" Ctrl + C?
Re[4]: Задачка. Как правильно залогировать результат работы
От: Antipod  
Дата: 17.10.07 16:23
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Antipod, Вы писали:


A>>Я не совсем понял про вариант когда DoSomething вызывается в отдельном потоке и "ожидает консольного ввода". Если можете, расскажите пожалуйста подробнее суть идеи.


_FR>Да это я шутки ради придумал а суть простая: DoSomething запускается в отдельном потоке. после этого вызывается Console.ReadLine() если она вернула "Cancel", то поток завершается. Потом вызывается логирование. Другое приложение при запуске первого перенаправляет ввод на себя и по нажатию Stop шлёт в консоль этот самый "Cancel".


_FR>Но лучше почитать об именованных объектах.


Можно пожалуйста ссылку где можно об этом почитать или хотя бы как это звучит на английском?

Спасибо.
Re[5]: Задачка. Как правильно залогировать результат работы
От: _FRED_ Черногория
Дата: 17.10.07 16:40
Оценка:
Здравствуйте, Antipod, Вы писали:

A>Можно пожалуйста ссылку где можно об этом почитать или хотя бы как это звучит на английском?


Почитать для начала лучше всего Рихтера. Раздел про синхронизацию потоков (например, здесь) или статьи на этом сайте Работа с потоками в C# (I)
Автор(ы): Joseph Albahari
Дата: 24.03.2007
Подробно рассматривается работа с потоками — запуск, завершение, прерывание, блокировки, синхронизация, контексты синхронизации, особенности взаимодействия с апартаментами, а также потоковые возможности .NET — потоковые таймеры, пулы потоков, BackgroundWorker, асинхронные методы и делегаты.
В статье использован материал из книги Joseph Albahari, Ben Albahari "C# 3.0 in a Nutshell" — http://www.oreilly.com/catalog/9780596527570/
и Работа с потоками в C# (II)
Автор(ы): Joseph Albahari
Дата: 27.06.2007
Окончание статьи, опубликованной в RSDN Magazine #1-2007. Рассматриваются особенности взаимодействия с апартаментами, потоковые таймеры, пулы потоков, BackgroundWorker, асинхронные методы и делегаты.
В статье использован материал из книги Joseph Albahari, Ben Albahari "C# 3.0 in a Nutshell" — http://www.oreilly.com/catalog/9780596527570/
... << RSDN@Home 1.2.0 alpha rev. 717>>
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.