首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WinForms 中 Invalidate、Update 與 Refresh 的差異解析

     編輯:關於.NET

在 Windows Forms 開發中,手動觸發控制項重繪時常會用到 Invalidate、Update、Refresh 三個方法。它們雖然都能讓畫面更新,但運作機制與適用情境截然不同。

方法比較

方法行為同步/非同步適用情境
Invalidate() 將指定區域標記為「需重繪」,發送 WM_PAINT 訊息到訊息佇列,等待下一次訊息迴圈處理。 非同步 大多數情況,效能最佳,避免重複重繪。
Update() 立即處理目前佇列中所有的 WM_PAINT 訊息,強制同步重繪。 同步 需要立即看到畫面更新(如長時間運算中顯示進度)。
Refresh() 相當於 Invalidate() + Update(),先標記再強制同步重繪,且會遞迴處理子控制項。 同步 必須確保控制項及其子項立即完整重繪。

Invalidate 重載與內部運作

Invalidate() 無參數版本內部呼叫 Invalidate(false),表示不重繪子控制項。若傳入 true,則會連同子控制項一起標記重繪。

核心邏輯(簡化版):

public void Invalidate(bool invalidateChildren)
{
    if (this.IsHandleCreated)
    {
        if (invalidateChildren)
        {
            // 使用 RedrawWindow 連同子視窗一起重繪
            SafeNativeMethods.RedrawWindow(..., 133); // RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE
        }
        else
        {
            // 僅重繪自身
            SafeNativeMethods.InvalidateRect(..., (controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque);
        }
        this.NotifyInvalidate(this.ClientRectangle);
    }
}

最佳實務建議

  • 預設使用 Invalidate(),讓系統在適當時機批次處理重繪,效能最好。
  • 只有在「必須馬上看到結果」時才呼叫 Update() 或 Refresh()。
  • 頻繁呼叫 Refresh() 會導致 UI 執行緒阻塞,造成介面卡頓。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved