c# - Windows 窗体定时器

标签 c# winforms timer

我有两个窗体。我需要在每个调整后的时间间隔内打开第二个表格。第二种形式需要在指定的秒数内出现。在主窗体中:

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/

相关文章:

c# - 谷歌地图在 htc one x 等高像素密度设备上显示相当模糊,有什么方法可以解决这个问题吗?

c# - 如何正确联合不同的 IQueryable,然后在 JSON 中序列化它们

c# - WinForms 中的计时器

c# - C# 中的高分辨率计时器

swift - 我无法在 Swift 3 中使用计时器更改 label.text

C# Executable 执行目录

c# - 可编辑标签控件

c# - .Net 中的同步 ListView

Java Swing : Change Text after delay

c# - MVC 需要 TagHelper 使用 FluentValidation ASPNET Core