我有一个使用ShowDialog函数启动Form的管理器类。现在,我正在启动一个事件(如计时器),并希望管理员在计时器到期时关闭表单。
我使用了2个课程:
namespace ConsoleApplication3
{
class Manager
{
Timer UpdTimer = null;
readonly int REFRESH_STATUS_TIME_INTERVAL = 5000;
Form1 form1;
public Manager()
{
}
public void ManageTheForms()
{
UpdTimer = new Timer(REFRESH_STATUS_TIME_INTERVAL);
// start updating timer
//UpdTimer.Interval = REFRESH_STATUS_TIME_INTERVAL;
UpdTimer.Elapsed += new ElapsedEventHandler(PriorityUpdTimer_Elapsed);
UpdTimer.Start();
form1 = new Form1();
form1.ShowDialog();
}
public void PriorityUpdTimer_Elapsed(object source, ElapsedEventArgs e)
{
UpdTimer = null;
form1.closeFormFromAnotherThread();
}
}
}
Form1 Class:
namespace ConsoleApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
}
delegate void CloseFormFromAnotherThread();
public void closeFormFromAnotherThread()
{
if (this.InvokeRequired)
{
CloseFormFromAnotherThread del = new CloseFormFromAnotherThread(closeFormFromAnotherThread);
this.Invoke(del, new object[] { });
}
else
{
this.Close();
}
}
}
}
答案 0 :(得分:1)
如果我是对的,你想在计时器停止时关闭表格。
这就是我这样做的方式:
System.Threading.Timer formTimer;
我使用布尔值来查看计时器是否仍处于活动状态
public Boolean active { get; set; }
创建此功能:
public void timerControl()
{
if (!active) formTimer = new System.Threading.Timer(new TimerCallback(TimerProc));
try
{
formTimer.Change(REFRESH_STATUS_TIME_INTERVAL, 0);
}
catch {}
active = true;
}
要完成计时器,您需要使用TimerProc函数,该函数在创建新计时器时调用:
private void TimerProc(object state)
{
System.Threading.Timer t = (System.Threading.Timer)state;
t.Dispose();
try
{
CloseScreen();
}
catch{}
}
为了让我更容易编程我创建了CloseScreen()函数:
public void CloseScreen()
{
if (InvokeRequired)
{
this.Invoke(new Action(CloseScreen), new object[] { });
return;
}
active = false;
Close();
}
将所有这些函数放在表单类中,然后使用timerControl激活计时器。您可以选择从Manager类访问它:Form1.TimerControl();
或者将它放在事件处理程序中,成功!