#c# #multithreading #timer
#c# #многопоточность #таймер
Вопрос:
Я здесь немного новичок…и изучение потоков.Таймер … У меня есть таймер в оконной службе, который запускает функцию в 16:48:00 .. Я просто хочу снова запустить таймер в 21:00: 00 вечера…затем 22:00:00…нет фиксированного интервала таймера между временными интервалами
вот мой код, который я пробовал:
public partial class ASMSService1 : ServiceBase
{
private Timer myTimer;
private DateTime inputDate;
private DateTime yesterday;
private DateTime today;
public ASMSService1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
inputDate = DateTime.Today;
today = DateTime.Today;
yesterday = today.AddDays(-1);
//time is Set here
SetTimer(16, 48, 00);
}
private void SetTimer(int hours, int minutes, int seconds)
{
inputDate = DateTime.Today.AddHours(hours).AddMinutes(minutes).AddSeconds(seconds);
String date1 = inputDate.TimeOfDay.ToString();
if (DateTime.Now > inputDate)
{
inputDate = inputDate.AddDays(1);
}
if (date1.CompareTo("16:48:00") == 0)
{
myTimer = new System.Threading.Timer(new TimerCallback(FirstSlotOperations));
myTimer.Change((int)(inputDate - DateTime.Now).TotalMilliseconds, Timeout.Infinite);
}
}
private void FirstSlotOperations(object e)
{
//some operation
//Need to reset the Timer at 21:00:00
}
}
Я нашел timer.change из статьи MSDN..Но я не уверен, как это реализовать в моем случае
Я пробовал Thread.sleep() .. Но я также ищу какую-то альтернативу, если это возможно.. любое предложение было бы полезно
Комментарии:
1. Пожалуйста, более точно опишите, чего вы хотите от приведенного выше кода и какова цель использования timer?
2. Вы проверяли какие-либо примеры, подобные этому ?
3. На самом деле мне нужно выполнить какую-то конкретную операцию, если программа достигла определенного времени, установленного таймером
Ответ №1:
Я думаю, что Артем Харламов прав, если вы предоставите более подробную информацию о том, какую конкретную функциональность вы намерены достичь, есть больше шансов получить ответ, который ближе к тому, что вам нужно.
Мой взгляд на то, что вы сейчас представили:
- Если вы хотите, чтобы служба выполняла определенную операцию всякий раз, когда время суток равно предопределенному значению (например, 16:48 согласно предоставленному вами коду), я думаю, что ваш подход довольно сложный, поскольку вы могли бы добиться этого проще, используя запланированные задачи, которые также будут охватывать случайв котором вы пытаетесь выполнить операцию в своей службе не в определенное время дня, а каждые x промежутков времени.
- Объект timer, похоже, не предоставляет никаких свойств или методов, которые сообщали бы вам, сколько времени прошло с момента его первого запуска, для этого вы можете использовать свойства и получать текущее время при каждом вызове SetTimer, установить свойство в классе ASMSService1 и получить разницу с текущим временем при выполнении FirstSlotOperationsвызывается.
Возможно, это не совсем то, что вы хотите сделать, но если вы не будете немного более конкретны в своих ожиданиях, их трудно эффективно решить.
Ответ №2:
Вам не нужен какой-либо объект для получения текущего времени. Просто используйте:
private void FirstSlotOperations(object e)
{
DateTime current = DateTime.Now;
}
Объект, переданный в качестве аргумента в функции обратного вызова, является объектом timer, поэтому вы не можете получить от него данные. Вы можете использовать его только для работы с объектом timer, например.
private void FirstSlotOperations(object e)
{
Timer t = e as Timer;
t.Change(1000, 0);
}
Комментарии:
1. Я отредактировал свою тему… На самом деле я хочу получить время, установленное таймером (16:48:00), указанное в коде .. Не текущее время.. Прошу прощения за это