首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForm 子窗體單例模式:避免重複實例化與定時器重複啟動

     編輯:程式設計綜合問答

問題場景

主窗體 Form1 按鈕打開 Form2,Form2 含 30 分鐘發送郵件的定時器。點擊保存後 Form2 隱藏,再次點擊按鈕會 new 新實例導致定時器重複運行。

單例模式正確實現

public partial class Form1 : Form {
    private Form2 _form2; // 類級字段持有引用

    private void button1_Click(object sender, EventArgs e) {
        if (_form2 == null || _form2.IsDisposed) {
            _form2 = new Form2();
            _form2.FormClosed += (s, args) => _form2 = null; // 關閉時釋放引用
        }
        _form2.Show(); // 隱藏狀態下也會顯示
        _form2.BringToFront();
    }
}

Form2 定時器管理

public partial class Form2 : Form {
    private System.Timers.Timer _timer;

    public Form2() {
        InitializeComponent();
        _timer = new System.Timers.Timer(30 * 60 * 1000);
        _timer.Elapsed += (s, e) => SendEmail();
        _timer.AutoReset = true;
    }

    private void btnSave_Click(object sender, EventArgs e) {
        _timer.Start(); // 或根據配置決定啟停
        this.Hide();
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (e.CloseReason == CloseReason.UserClosing) {
            e.Cancel = true; // 取消關閉
            this.Hide();     // 改為隱藏
        }
        _timer?.Stop();
        base.OnFormClosing(e);
    }
}

關鍵點

  • Form1 持有 Form2 唯一引用,判空後復用。
  • Form2 關閉事件轉為隱藏,防止用戶點擊右上角 X 銷毀實例。
  • 定時器隨窗體生命周期啟停,避免孤立線程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved