
記錄下最近基於 Avalonia 開發桌面應用時遇到並解決的兩個典型問題,希望能給遇到同類問題的開發者提供參考。
1. 剪貼簿複製異常(AOT 崩潰 / 偵錯拋 COM 異常)
問題現象
項目中對 TextBox 或 SelectedTextBlock 控制項的文字執行 Ctrl+C 複製操作時,出現兩種異常表現:
- AOT 發佈執行程序直接崩潰,查看應用程式事件:

- Debug 偵錯模式下,未捕獲全域異常,
Program的Main函式會拋出明確的 COM 異常:
System.Runtime.InteropServices.COMException:“尚未呼叫 CoInitialize。 (0x800401F0 (CO_E_NOTINITIALIZED))”
根因定位
排查程式碼後發現核心問題出在 Program.cs 的 Main 函式定義上——將入口函式宣告為 async Task 型別,而非 Avalonia 要求的同步:

將 async Task 改為 void 修復,Avalonia 文件:Application Lifetimes 其實有說明:

原理分析
Avalonia 作為桌面 UI 框架,對主線程的 SynchronizationContext(同步上下文)有強依賴,剪貼簿、視窗訊息迴圈等系統級操作均需基於穩定的主線程上下文執行。
async Task Main會讓 CLR 以非同步方式管理主線程生命週期,破壞 Avalonia 初始化的同步上下文,導致剪貼簿操作時觸發CoInitialize未呼叫的 COM 異常;- Avalonia 官方文件明確說明:應用入口階段(Main 函式)不應依賴未就緒的
SynchronizationContext,因此入口函式必須為同步。
2. Tab 切換 DataGrid 卡頓
問題場景
項目使用 Dock 控制項(VS 風格版面配置,Document 等價於 TabControl 的 TabItem),在 Document 中嵌入 DataGrid 展示資料:
- 數據量極小(僅幾十筆、8-9 個欄位);
- 執行環境為 Win7/Windows Server 2019,Win10 同事回報也卡;
- 現象:Debug 模式切換 Tab 卡頓約 2 秒,AOT 發佈後卡頓加劇至 3-4 秒;
- 對比:單視窗直接展示
DataGrid載入幾十萬筆資料(15 個欄位)時,即時刷新很流暢。
排查過程
- 初期懷疑
DataGrid使用方式問題:優化欄位綁定(僅單向綁定)、移除複雜樣式/動畫,卡頓無明顯改善; - 懷疑 Dock 控制項效能問題:更新 Dock 控制項版本、切換舊版本,問題依舊;
- 排除 Dock 控制項影響:改用原生
TabControl測試,卡頓問題重現; - 社群求助:在 Avalonia 交流群回饋後,群友提示嘗試
TreeDataGrid替代DataGrid,替換後卡頓問題完全解決。
DataGrid 是早期移植的 WPF(連結指 Silverlight)風格元件,“Cell 級控制項+被動虛擬化”的設計在小數據量+Tab 切換重建時,控制項實例化/版面配置開銷被 Win7/AOT 環境放大;而 TreeDataGrid 是 Avalonia 團隊重構的新元件,“行級渲染+強制虛擬化”的設計從根源上降低了切換開銷,且官方已明確推薦使用 TreeDataGrid 替代 DataGrid,討論請點擊連結。

這裡要明確,TreeDataGrid 已被 Avalonia 放入商用套件中

使用免費版,必然會有新發現 Bug 得不到修復的情況(官方把舊版維護推給了開源社群分支),Avalonia.Controls.TreeDataGrid 免費版可使用 11.1.1 及以前版本:

Semi 提供的配套主題庫對應版本為 11.1.1.1
總結
- Avalonia 入口函式
Main必須宣告為同步,async Task會破壞同步上下文,導致剪貼簿等系統級操作異常; DataGrid在 Tab 切換場景下存在效能短板,優先使用官方推薦的TreeDataGrid可解決卡頓問題;- Avalonia 的老元件(如 DataGrid)在老系統(Win7/Server)+AOT 發佈環境下易暴露效能問題,優先選擇官方新元件可減少踩坑,切記:及時更新最新控制項庫。
最後感謝 Avalonia 交流群的群友提供的解決方案,開源社群的交流總能快速定位這類“反直覺”的問題~