Необходимо проверять данные каждые 2 секунды, использование таймера заблокировало основной потокC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Необходимо проверять данные каждые 2 секунды, использование таймера заблокировало основной поток

Сообщение Anonymous »

Я пытаюсь использовать таймер для проверки данных из SQL каждые 2 секунды. Я пытаюсь получить текущий статус в своем приложении.
Например, если я нажму «Начать», второй человек получит сообщение.
Поэтому я использую таймер Чтобы сделать это, проблема в том, что таймер блокирует основной поток, и через 20/30 секунд таймер останавливается сам.
вот мой код:

Код: Выделить всё

Verify_User_Permission();
Функция, проверяющая разрешение пользователя. Если у него есть соответствующие разрешения, появится кнопка «Начать ежедневно» и запустится таймер. Если кто-то другой уже нажал на эту кнопку, кнопка появится. будет скрыт, и в раскадровке Daily_Meeting_sb
появится мигающий текст.

Код: Выделить всё

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);
}
}
Я меняю вызов SQL-запроса на Dispatcher.Invoke

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»