C# Windows窗体计时器
我有两张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
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函数?请发布提醒类的代码。