|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.03.2013, 14:15 | #1 |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
Несколько вопросов по многопоточности
Добрый день.
Сейчас потихоньку осваиваю потоки в C#, и во время изучения возникла небольшая проблема. Написал класс, который создает файл и с определенной перодичностью пишет в него записи. Функция для записи в файл запускается в методе класса, который запускается по таймеру, который стартует сразу после запуска функции Run(). Для запуска этой функции в методе Main создаю отдельный поток, в котором явно прописываю IsBackground = false. Несколько вопросов: 1)Если правильно понимаю, то свойство IsBackGround должно делать поток основным. Он становится равноправным потоку из которого он запущен, и приложение не должно завершаться до того как завершатся оба потока. 2)Что должен сделать метод Join()? Как понимаю, он приостанавливает выполнение потока для которого вызван. Но как запустить его заново? Сейчас ситуация такая: если я убираю строку Console.ReadLine(), то приложение завершается сразу после запуска. А мне казалось, что по-первому моему предположению, он должен был работать вечно (т. к. таймер в классе генератора никогда не выключается). 3)У меня есть подозрение, что проблема в таймере... что второй поток только включает таймер и завершается, а сам таймер уже работает в собственном фоновом потоке, который не является основным и поэтому не работает мое первое предположение. Отсюда становится понятным и почему в файл идет запись: таймер работает пока работает основной поток (метод Main) и периодически вызывает метод для записи данных. 4)Если мое последнее предположение верно, то каким образом можно запустить таймер в основном потоке? Или, например, приостановить выполнение основного потока? Тогда получится, что фоновый поток таймера будет выполняться, в то время как основной поток будет приостановлен. Сейчас, конечно, все работает (до нажатия клавиши), но хочется разобраться что к чему и почему все так. Буду очень рад, если вы прокомметируете мои гипотезы. Код: Код:
Последний раз редактировалось RomanA; 05.03.2013 в 14:24. |
05.03.2013, 14:28 | #2 | ||
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Цитата:
Цитата:
------------------------- По какому условию Ваша программа должна завершить работу вообще?
Благодарить в репутацию. Проклинать — туда же
|
||
05.03.2013, 14:33 | #3 |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
На вопрос про приостановку потока метода Main ответ нашел:
Код:
|
05.03.2013, 14:40 | #4 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
3 - верно
4 - while(true) { Thread.Sleep(10);}. Второй поток нафиг не нужен, таймер создавать и запускать прям в Main(). Вместо "true" подставить условие выхода из программы. Всё
Благодарить в репутацию. Проклинать — туда же
|
05.03.2013, 14:42 | #5 | ||
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
Цитата:
Цитата:
Нет условия, просто тестирую, ничего осмысленного здесь нет, хочется протестировать и научиться. А вообще, по моему замыслу она должна работать вечно. |
||
05.03.2013, 14:46 | #6 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Читайте мой предыдущий пост
Благодарить в репутацию. Проклинать — туда же
|
05.03.2013, 14:50 | #7 |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Несколько вопросов | shrek1993 | Visual C++ | 3 | 05.08.2012 18:53 |
Несколько вопросов по C++ | Antitime | Общие вопросы C/C++ | 10 | 26.01.2012 15:00 |
Несколько вопросов | DeFix | Работа с сетью в Delphi | 3 | 28.11.2011 13:48 |
несколько вопросов | spydark91 | Общие вопросы Delphi | 2 | 18.07.2011 13:48 |
БД - Несколько вопросов | lutdan | БД в Delphi | 3 | 11.10.2009 20:22 |