我在应用程序中切换表单时遇到了一些问题。 它有两种形式:
如果我单击按钮,应用程序执行方法 logOut ,它可以正常工作。 如果它与计时器事件一起执行 - 它不起作用。我需要帮助才能理解为什么它不能以这种方式工作?
第一张表格的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Form2 frmm2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
frmm2 = new Form2(this);
frmm2.Show(this);
this.Hide();
}
}
}
第二种形式
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
private System.Timers.Timer tmr;
private Form2 frm2;
private Form1 frm1;
public Form2(Form1 f1)
{
InitializeComponent();
tmr = new System.Timers.Timer();
tmr.Elapsed += new ElapsedEventHandler(OnTimedEvent);
tmr.Interval = 10000;
tmr.Enabled = true;
frm1 = f1;
frm2 = this;
}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
tmr.Stop();
MessageBox.Show("Before timer event");
logOut();
MessageBox.Show("After timer event");
}
private void button1_Click(object sender, EventArgs e)
{
logOut();
}
public void logOut()
{
if (tmr != null)
{
tmr.Stop();
tmr = null;
}
/*
* It doesn't work directly. I'll try to do it in another way.
this.Hide();
this.Owner.Show();
this.Owner.Activate();
*/
frm1.Show();
frm1.Activate();
frm2.Close();
}
}
}
感谢您的回答!
答案 0 :(得分:2)
假设LogOut
方法在UI线程上执行某些操作,例如关闭表单。问题是Elapsed事件是在线程池线程上引发的,而不是在UI线程上引发的。
您可以尝试System.Windows.Forms.Timer
而不是System.Timers.Timer
,因为前者会在UI线程上发布已经过去的事件。