C# Windows窗体计时器

C# Windows窗体计时器,c#,winforms,timer,C#,Winforms,Timer,我有两张windows窗体。我需要在每次调整的时间间隔内打开第二张表格。第二个表单需要在指定的秒数内显示。主要形式: public static System.Timers.Timer reminderTimer = new System.Timers.Timer(); private static void ActiveteReminder() { int duration = Reminder.Frequency; reminderTimer.Interval = dura

我有两张windows窗体。我需要在每次调整的时间间隔内打开第二张表格。第二个表单需要在指定的秒数内显示。主要形式:

public static System.Timers.Timer reminderTimer = new System.Timers.Timer();

private static void ActiveteReminder()
{
    int duration = Reminder.Frequency;
    reminderTimer.Interval = duration;
    reminderTimer.Elapsed += new System.Timers.ElapsedEventHandler(reminderTimer_Elapsed);
    reminderTimer.AutoReset = false;
    reminderTimer.Start();
}

static void reminderTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    ReminderForm reminderForm = new ReminderForm();
    reminderForm.Show();

    if (Reminder.ReminderStatus == ReminderStatusEnum.ReminderStatus_Active)
        reminderTimer.Start();
    else
        reminderTimer.Stop();
}
第二种形式:

public System.Timers.Timer reminderTimer = new System.Timers.Timer();

private void ActivateTimer()
{
    int duration = Reminder.Duration;
    reminderTimer.Interval = duration;
    reminderTimer.AutoReset = false;
    reminderTimer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    reminderTimer.Start();
}

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    reminderTimer.Dispose();
    this.Close();
}
我在尝试关闭第二个窗体时出现以下错误: “跨线程操作无效:从创建控件的线程以外的线程访问控件‘提醒执行’”


如何解决此问题?

这里的问题是您将一个
系统.Timers.Timer
和一个WinForms应用程序组合在一起。
已用
回调将在线程池线程上发生。从UI线程以外的任何线程与winforms元素通信都是非法的。因此,当您从回调中执行以下行时,您会得到一个异常

this.Close();

要解决这个问题,只需使用
System.Windows.Forms.Timer
。这将在UI线程上引发其事件,您可以避免任何跨线程通信

这里的问题是,您正在将
系统.Timers.Timer
与WinForms应用程序相结合。
已用
回调将在线程池线程上发生。从UI线程以外的任何线程与winforms元素通信都是非法的。因此,当您从回调中执行以下行时,您会得到一个异常

this.Close();

要解决这个问题,只需使用
System.Windows.Forms.Timer
。这将在UI线程上引发其事件,您可以避免任何跨线程通信

您需要检查表单的
invokererequired
标志。这应该告诉您需要了解的内容:

您需要检查表单的
invokererequired
标志。这应该告诉您需要了解的内容:

您应该在UI线程中输入所有与UI相关的代码。 wcith应该做的第一件事是删除所有静态单词

第一种形式

private void reminderTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  Elapsed();  
}

private void Elapsed()
{
  if(InvokeRequired)
  {
    Invoke((Action)Elapsed);
    return;
  }

  ReminderForm reminderForm = new ReminderForm();
  reminderForm.Show();

  if (Reminder.ReminderStatus == ReminderStatusEnum.ReminderStatus_Active)
    reminderTimer.Start();
  else
    reminderTimer.Stop();
}
第二种形式

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Elapsed();
}

private void Elapsed()
{
  if(InvokeRequired)
  {
    Invoke((Action)Elapsed);
    return;
  }
  reminderTimer.Dispose();
  this.Close();
}

您应该在UI线程中查找所有与UI相关的代码。 wcith应该做的第一件事是删除所有静态单词

第一种形式

private void reminderTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  Elapsed();  
}

private void Elapsed()
{
  if(InvokeRequired)
  {
    Invoke((Action)Elapsed);
    return;
  }

  ReminderForm reminderForm = new ReminderForm();
  reminderForm.Show();

  if (Reminder.ReminderStatus == ReminderStatusEnum.ReminderStatus_Active)
    reminderTimer.Start();
  else
    reminderTimer.Stop();
}
第二种形式

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Elapsed();
}

private void Elapsed()
{
  if(InvokeRequired)
  {
    Invoke((Action)Elapsed);
    return;
  }
  reminderTimer.Dispose();
  this.Close();
}

我应该在哪里使用InvokeRequired?是这样吗?if(remendPerform.invokererequired)remendPerform.Show();我应该在哪里使用InvokeRequired?是这样吗?if(remendPerform.invokererequired)remendPerform.Show();您在哪里调用ActivateTimer函数?请发布提醒类的代码。你在哪里调用ActivateTimer函数?请发布提醒类的代码。