c# - 从另一个线程关闭表单

标签 c# multithreading forms

我有一个管理器类,它使用 ShowDialog 函数启动一个表单。现在,我正在启动一个事件(如计时器),并希望经理在计时器到期时关闭表单。

我使用了 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 类:

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();
        }
    }

}

最佳答案

如果我是对的,您想在计时器停止时关闭表单。

我是这样做的:

System.Threading.Timer formTimer;

我使用一个 bool 值来查看计时器是否仍处于事件状态

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(); 或者将它放在事件处理程序中,成功!

关于c# - 从另一个线程关闭表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14036678/

相关文章:

java - 处理 jackrabbit 中的 InvalidItemStateException

c# - 设计数据库文件格式

c# - 如何在回发时防止页面刷新?

c# - 如何使用 Linq 获取每个组中的第一条记录

php - symfony 插入多行而不是一行

php - 是否可以在运行时更改 max_input_vars?

javascript - onchange joomla JHTML

c# - 如何使用 SQL CE 加速 LINQ 插入?

java - 关闭线程时遇到问题

multithreading - bash中的简单后台进程问题