原创 Visual Studio 2017 以前的舊格式的 csproj Import 進來的 targets 文件有時不能正確計算屬性(PropertyGroup)和集合(ItemGroup)

  我在之前的博客中有教大家如何編寫 NuGet 工具包,其中就有編寫 .targets 文件。 我在實際的使用中,發現 Visual Studio 2017 帶來的含 Sdk 的新 csproj 格式基本上沒有多少坑;然而舊的 cspro

原创 在有 UI 線程參與的同步鎖(如 AutoResetEvent)內部使用 await 可能導致死鎖

  AutoResetEvent、ManualResetEvent、Monitor、lock 等等這些用來做同步的類,如果在異步上下文(await)中使用,需要非常謹慎。 本文將說一個在同步上下文中非常常見的一種用法,換成異步上下文中會產生

原创 .NET 中小心嵌套等待的 Task,它可能會耗盡你線程池的現有資源,出現類似死鎖的情況

  一個簡單的 Task 不會消耗多少時間,但如果你不合適地將 Task 轉爲同步等待,那麼也可能很快耗盡線程池的所有資源,出現類似死鎖的情況。 本文將以一個最簡單的例子說明如何出現以及避免這樣的問題。   本文內容 耗時的 Ta

原创 WindowsXamlHost:在 WPF 中使用 UWP 控件庫中的控件

  在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我們說到了在 WPF 中引入簡單的 UWP 控件以及相關的注意事項。不過,通常更有實際價值的是更復雜的

原创 如何創建一個基於 .NET Core 3 的 WPF 項目

  在 Connect(); 2018 大會上,微軟發佈了 .NET Core 3 Preview,以及基於 .NET Core 3 的 WPF;同時還發布了 Visual Studio 2019 預覽版。不過 Visual Studio

原创 Win2D 中的遊戲循環:CanvasAnimatedControl

  Win2D 是 DirectX 的一個高層封裝,提供了極大 DirectX 性能的同時,又具有很好用的 API 設計。 用 Win2D 除了能做出高性能的視覺效果之外,還可以輕而易舉地搭建一個遊戲循環出來。使用 Win2D 的遊戲循環,

原创 .NET/C# 反射的的性能數據,以及高性能開發建議(反射獲取 Attribute 和反射調用方法)

  大家都說反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能;這些問題卻沒有統一的描述。 本文將用數據說明反射各個方法和替代方法的性能差異,並提供一些反射代碼的編寫建議。爲了解決反射的性能問題,你可以遵循本文采用的各種方案。   本

原创 使用 Windows 10 中的加速度計(Accelerometer,重力傳感器)

  在做 UWP 應用開發的時候還有什麼理由可以用到加速度計呢?場景很多啦,比如做遊戲,做類似 Surface Hub 那種一邊旋轉,一邊所有內容跟着一起轉的效果。 Windows 10 UWP 中的加速度計使用非常簡單,只需要簡單幾句代碼

原创 瞭解 .NET 的默認 TaskScheduler 和線程池(ThreadPool)設置,避免讓 Task.Run 的性能急劇降低

  .NET Framework 4.5 開始引入 Task.Run,它可以很方便的幫助我們使用 async / await 語法,同時還使用線程池來幫助我們管理線程。以至於我們編寫異步代碼可以像編寫同步代碼一樣方便。 不過,如果濫用,也可

原创 .NET 編寫一個可以異步等待循環中任何一個部分的 Awaiter

  林德熙 小夥伴希望保存一個文件,並且希望如果出錯了也要不斷地重試。然而我認爲如果一直錯誤則應該對外拋出異常讓調用者知道爲什麼會一直錯誤。 這似乎是一個矛盾的要求。然而最終我想到了一個辦法:讓重試一直進行下去,誰需要關心異常誰就去 cat

原创 文件和文件夾不存在的時候,FileSystemWatcher 監聽不到文件的改變?如果遞歸地監聽就可以了

  當你需要監視文件或文件夾的改變的時候,使用 FileSystemWatcher 便可以完成。不過,FileSystemWatcher 對文件夾的監視要求文件夾必須存在,否則會產生錯誤“無效路徑”。 那麼,如果文件或文件夾不存在的時候可以

原创 C#/.NET 使用 CommandLineParser 來標準化地解析命令行

CommandLineParser 是一款用於解析命令行參數的 NuGet 包。你只需要關注你的業務,而命令行解析只需要極少量的配置代碼。 本文將介紹如何使用 CommandLineParser 高效寫出自己程序的命令行解析部分。  

原创 不要使用 Dispatcher.Invoke,因爲它可能在你的延遲初始化 Lazy 中導致死鎖

  WPF 中爲了 UI 的跨線程訪問,提供了 Dispatcher 線程模型。其 Invoke 方法,無論在哪個線程調用,都可以讓傳入的方法回到 UI 線程。 然而,如果你在 Lazy 上下文中使用了 Invoke,那麼當這個 Lazy<

原创 使用 ReSharper,輸入即遵循 StyleCop 的代碼格式化規範

StyleCop 可以幫助強制執行代碼格式化規範,ReSharper 可以幫助你更高效地編寫代碼。把兩者結合起來,你便能高效地編寫符合團隊強制格式化規範的代碼來。 本文就介紹如何使用 ReSharper 來高效地遵循 StyleCop 的代

原创 用 dotTrace 進行性能分析時,各種不同性能分析選項的含義和用途

  對 .NET 程序進行性能分析,dotTrace 能應對絕大多數的場景。在開啓一個進程進行性能分析之前,我們會看到一些性能分析選項(Profiler Options)。本文將介紹這幾個選項的含義,並用實際的例子來說明其用途。   本