У меня есть следующие сценарии, использующие System.Timers.Timer.Резьба внутри метода System.Timers.Timer
Создание объекта Timer и назначить метод
_JobListener.Enabled = false;
_JobListener.Elapsed += (this.JobListener_Elapsed);
В JobListener_Elapsed, я создал другой поток для выполнения некоторых функций.
JobListener_Elapsed
{
//stop the timer
_JobListener.Enabled = false;
System.Threading.Thread pollThread = new Thread(JobListener_ElapsedAsync);
pollThread.Start();
//join to the main timer thread
pollThread.Join();
//restart the timer
_JobListener.Enabled = true;
}
Внутри JobListener_ElapsedAsync я регистрирую статус включения таймера.
private void JobListener_ElapsedAsync()
{
try{
log Timer.Enabled
some other code
}finally
{
_JobListener.Enabled = true;
}
}
Однако, я могу видеть несколько раз, он может видеть, что статус таймера является истинным, что неверно. Таймер должен быть остановлен при запуске JobListener_ElapsedAsync.
Любая идея?
Какой смысл начинать новый поток, если поток, начинающийся с него, просто блокируется до тех пор, пока он не закончится? Вы можете просто запустить код непосредственно в обработчике событий, если вы это делаете. – Servy
@Servy Я задавал себе тот же вопрос. Это какой-то старый код. Я исправил его, чтобы не использовать отдельный поток. Но я смущен этим поведением, когда сохраняю этот отдельный поток внутри метода Timer. – Helic
Где в вашем коде вы когда-либо включали таймер? Он должен быть включен * где-то *. Этот код, вероятно, вызывается во время его запуска. У вас также может быть несколько обработчиков с истекшим сроком, вы можете просто наблюдать это неправильно, ваш метод async может запускать * другую операцию async, что приводит к тому, что текущий поток продолжает включать таймер и т. Д. Простым фактом является то, t показано достаточно кода, чтобы узнать, в чем проблема. – Servy