Вот задачка, не могу придумать как лучше реализовать средствами .NetFramework 2.0 (C#).
1. Есть консольное приложение в котором два метода: DoSomething и LogResults.
— LogResults вызывается всегда после того как DoSomething закончит свою работу. Грубо говоря, в DoSomething происходит накопление результатов работы, которые потом нужно залогировать. Результат логирования – текстовый файл, содержание которого сериализованные результаты.
— DoSomething может выполняться от нескольких минут до нескольких часов.
2. Есть Win приложение, в ктором всего две кнопки: Start и Cancel. Когда жмем Start, создается процесс в котором вызывается консольное приложение из пункта 1. Когда жмем Cancel процесс с консольным приложением должен прерваться, но при этом результаты должны быть залогированы, т.е. текстовый файл должен быть создан. Сейчас вызывается просто метод Kill, который не ессно не даст попасть в LogResults.
Помогите пожалуйста найти решение для задаичи.
Спасибо
Re: Задачка. Как правильно залогировать результат работы
Здравствуйте, 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]: Задачка. Как правильно залогировать результат работы
Здравствуйте, _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]: Задачка. Как правильно залогировать результат работы
Здравствуйте, 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: Задачка. Как правильно залогировать результат работы
Здравствуйте, 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]: Задачка. Как правильно залогировать результат работы
Здравствуйте, 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]: Задачка. Как правильно залогировать результат работы
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Antipod, Вы писали:
A>>Я не совсем понял про вариант когда DoSomething вызывается в отдельном потоке и "ожидает консольного ввода". Если можете, расскажите пожалуйста подробнее суть идеи.
_FR>Да это я шутки ради придумал а суть простая: DoSomething запускается в отдельном потоке. после этого вызывается Console.ReadLine() если она вернула "Cancel", то поток завершается. Потом вызывается логирование. Другое приложение при запуске первого перенаправляет ввод на себя и по нажатию Stop шлёт в консоль этот самый "Cancel".
_FR>Но лучше почитать об именованных объектах.
Можно пожалуйста ссылку где можно об этом почитать или хотя бы как это звучит на английском?
Спасибо.
Re[5]: Задачка. Как правильно залогировать результат работы