Например, если я нажму «Начать», второй человек получит сообщение.
Поэтому я использую таймер Чтобы сделать это, проблема в том, что таймер блокирует основной поток, и через 20/30 секунд таймер останавливается сам.
вот мой код:
Код: Выделить всё
Verify_User_Permission();
появится мигающий текст.
Код: Выделить всё
private void Verify_User_Permission()
{
if (timer_daily_meeting != null)
{
timer_daily_meeting.Stop();
}
//Verify the User Permission
if (Daily_days.Contains(DateTime.Now.DayOfWeek.ToString()))
{
if (Daily_Meeting_Summary.Count == 0)
{
foreach (string Division in List_Divisions)
{
List List_Daily_Meeting = Function_Select_SQL.Get_Daily_Meeting("", Division, DateTime.Now);
Daily_Meeting_Summary.Add(Division, (List_Daily_Meeting == null || List_Daily_Meeting[0].End_Time == (DateTime?)null ? "False" : "True"));
}
}
else
{
List List_Daily_Meeting = Function_Select_SQL.Get_Daily_Meeting("", Division_Selected, DateTime.Now);
Daily_Meeting_Summary[Division_Selected] = (List_Daily_Meeting == null || List_Daily_Meeting[0].End_Time == (DateTime?)null ? "False" : "True");
}
if (Daily_Meeting_Summary.Where(x => x.Value == "True").Count() != Daily_Meeting_Summary.Count)
{
InitTimer_Daily_Meeting();
}
}
}
Код: Выделить всё
public void InitTimer_Daily_Meeting()
{
List List_Admin_Settings = Function_Select_SQL.Get_Admin_Settings("Daily_Days_Setting");
string[] Daily_days = List_Admin_Settings != null && List_Admin_Settings.Count == 1? List_Admin_Settings[0].Setting_First_Value.Split(',') : null;
if (Daily_days.Contains(DateTime.Now.DayOfWeek.ToString()))
{
timer_daily_meeting = new Timer();
timer_daily_meeting.Elapsed += Timer_daily_meeting_Elapsed;
timer_daily_meeting.Interval = 2000; // in miliseconds
timer_daily_meeting.AutoReset = false;
timer_daily_meeting.Start();
}
}
Код: Выделить всё
private void Timer_daily_meeting_Elapsed(object sender, ElapsedEventArgs e)
{
Verify_Timer_Elapsed_Time();
Verify_User_Permission();
}
private void Verify_Timer_Elapsed_Time()
{
timer_daily_meeting.Stop();
List List_Admin_Settings = Function_Select_SQL.Get_Admin_Settings("Daily_Duration");
List List_Daily_Meeting = (Function_Select_SQL.Get_Daily_Meeting("", "", (Datagrid_Selected.Items[0] as Argo_Snowflake).Date_Created));
if (List_Daily_Meeting != null)
{
foreach (Daily_Meeting Daily_Meeting in List_Daily_Meeting)
{
if (Daily_Meeting.End_Time == (DateTime?)null)
{
if (Math.Round(((TimeSpan)(DateTime.Now - Daily_Meeting.Start_Time)).TotalMinutes, 1) >= double.Parse(List_Admin_Settings[0].Setting_First_Value))
{
Daily_Meeting.End_Time = DateTime.Now;
Daily_Meeting.Duration = Math.Round(((TimeSpan)(Daily_Meeting.End_Time - Daily_Meeting.Start_Time)).TotalMinutes, 1);
Function_Update_SQL.Update_Daily_Meeting(Daily_Meeting);
Daily_Meeting_Summary[Daily_Meeting.Division] = "True";
}
}
}
}
Изменить:
Использование Threading.Timer:
Код: Выделить всё
private System.Threading.Timer m_objTimer;
private bool m_blnStarted;
private readonly int m_intTickMs = 1000;
private object m_objLockObject = new object();
m_objTimer = new System.Threading.Timer(callback, m_objTimer, Timeout.Infinite, Timeout.Infinite);
Start();
public void Start()
{
if (!m_blnStarted)
{
lock (m_objLockObject)
{
if (!m_blnStarted) //double check after lock to be thread safe
{
m_blnStarted = true;
//Make it start in 'm_intTickMs' milliseconds,
//but don't auto callback when it's done (Timeout.Infinite)
m_objTimer.Change(m_intTickMs, Timeout.Infinite);
}
}
}
}
public void Stop()
{
lock (m_objLockObject)
{
m_blnStarted = false;
}
}
private void callback(object state)
{
List List_Admin_Settings = Application.Current.Dispatcher.Invoke(() => Get_Admin_Setting("Daily_Duration")).Result as List;
List List_Daily_Meeting = Application.Current.Dispatcher.Invoke(() => Get_Daily_Meeting("", (Datagrid_Selected.Items[0] as Argo_Snowflake).Date_Created)).Result as List;
Verify_User_Permission();
Thread.Sleep(1500);
//When your code has finished running, wait 'm_intTickMs' milliseconds
//and call the callback method again,
//but don't auto callback (Timeout.Infinite)
//m_objTimer.Change(m_intTickMs, Timeout.Infinite);
if (Daily_Meeting_Summary.Where(x => x.Value == "True").Count() == Daily_Meeting_Summary.Count)
{
Stop();
}
else
{
m_objTimer.Change(m_intTickMs, Timeout.Infinite);
}
}
Код: Выделить всё
private void Verify_User_Permission()
{
//Verify the User Permission
List List_Admin_Settings = Application.Current.Dispatcher.Invoke(() => Get_Admin_Setting("Daily_Days_Setting")).Result as List;
}
public async Task Get_Admin_Setting(string Setting)
{
await Task.Delay(100);
List List_Admin_Settings = null;
if (Setting == "Daily_Duration")
{
List_Admin_Settings = Function_Select_SQL.Get_Admin_Settings("Daily_Duration");
}
else if (Setting == "Daily_Days_Setting")
{
List_Admin_Settings = Function_Select_SQL.Get_Admin_Settings("Daily_Days_Setting");
}
return List_Admin_Settings;
Подробнее здесь: https://stackoverflow.com/questions/792 ... ain-thread