我有两个窗体。我需要在每个调整后的时间间隔内打开第二个表格。第二种形式需要在指定的秒数内出现。在主窗体中:
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();
}
尝试关闭第二个表单时出现以下错误: “跨线程操作无效:从创建它的线程以外的线程访问控件‘reminderForm’”
我该如何解决这个问题?
最佳答案
这里的问题是您要组合 System.Timers.Timer
和 WinForms 应用程序。 Elapsed
回调将发生在线程池线程上。从除 UI 线程以外的任何线程与 winforms 元素通信都是非法的。因此,当您从回调中执行以下行时,您会得到一个异常
this.Close();
要解决此问题,只需使用 System.Windows.Forms.Timer
即可。这将在 UI 线程上引发其事件,您可以避免任何跨线程通信。
关于c# - Windows 窗体定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537167/