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

C# Button 點擊觸發兩次事件的正確姿勢:別重複註冊,用邏輯控制

     編輯:程式設計疑難解答

問題:想讓按鈕點擊一次執行兩次邏輯?

原提問者嘗試重複註冊同一事件處理器:

this.btnMPrint.Click += new System.EventHandler(this.btnMPrint_Click);
this.btnMPrint.Click += new System.EventHandler(this.btnMPrint_Click);

雖然技術上可行(事件調用列表中添加兩次委託),但極不推薦:難以維護、調試困難、違背單一職責原則。

正確解決方案

方案一:在事件處理器內部調用兩次核心邏輯

private void btnMPrint_Click(object sender, EventArgs e) {
    DoPrintWork(); // 第一次
    DoPrintWork(); // 第二次
}

private void DoPrintWork() {
    // 真正的打印邏輯
}

方案二:使用循環或參數控制執行次數

private void btnMPrint_Click(object sender, EventArgs e) {
    for (int i = 0; i < 2; i++) {
        PerformPrint(i);
    }
}

方案三:若需異步/延遲執行,用 Task/Timer

private async void btnMPrint_Click(object sender, EventArgs e) {
    await Task.Run(() => DoPrintWork());
    await Task.Delay(100);
    await Task.Run(() => DoPrintWork());
}

為什麼不重複註冊事件?

  • 移除時需 -= 兩次,易漏掉導致內存洩漏。
  • 堆疊追蹤顯示同一方法被調用兩次,難以區分調用順序。
  • 語義不清:是「業務需要執行兩次」還是「誤註冊」?

總結

將「執行次數」作為業務邏輯參數顯式控制,而非利用事件機制副作用。代碼更清晰、可測試、易擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved