主頁 > .NET開發 > .NET 6 Preview 1 發布

.NET 6 Preview 1 發布

2021-02-19 06:04:42 .NET開發

前言

2021 年 2 月 17 日微軟發布了 .NET 6 的 Preview 1 版本,那么來看看都有什么新特性和改進吧,由于內容太多了因此只介紹一些較為重點的專案,ASP.NET Core 6 Preview 1 和 EF Core 6 Preview 1 同樣有很多的更新內容,但是限于篇幅就不在這里介紹了,

統一和擴展

.NET 6 在 .NET 5 的統一的基礎之上,繼續借助 Xamarin 擴展到 Android、iOS 和 macOS,此外,.NET 6 還擴展了 Blazor 的適用范圍,開發者可以通過 Blazor Hybrid 開發混合的跨平臺客戶端應用,

對于 Andriod、iOS 和 WebAssembly 將使用 mono 作為 runtime,但是基礎庫將全面與 .NET 統一,

安裝了 .NET 6 的 SDK 之后,將能構建移動平臺應用,例如對于安卓來說,運行 dotnet new andriod 就能創建一個安卓應用的專案,然后運行 dotnet run 便能直接啟動安卓模擬器運行,

另外,為了統一、簡化并擴展構建 Xamarin.Forms 應用,也將推出 MAUI 提供諸多改進和功能,允許開發者直接使用 .NET 開發桌面和移動客戶端程式,

主題

微軟利用 Blazor Server 開發了 themesof.net 用于展示和跟蹤主題,用戶可以通過查看該網站中列出的各專案內容來跟蹤 .NET 目前的狀態和未來的發展計劃,

平臺支持

.NET 6 LTS 將在 2021 年 11 月正式發布,除了目前支持的平臺之外,還將支持以下平臺:

  • Android
  • iOS
  • Mac 和 Mac Catalyst(x64 和 M1)
  • Windows Desktop 的 ARM64

MAUI

.NET MAUI (Multi-platform App UI) 是一組現代 UI 框架,在 Xamarin.Forms 的基礎上擴展并集成到 .NET 6 中,利用 MAUI 將能夠面向 Android、iOS、macOS 和 Windows 等構建應用,

在統一的程序中,將會把 Xamarin.Essentials 庫集成到 MAUI 當中,除此之外你將還能容易地利用設備機能,例如傳感器、照片庫、聯系人和存盤等等,

.NET 6 Preview 1 中首先包含了 Android 和 iOS 兩個平臺的 MAUI,可以在此處查看示例專案和安裝說明:https://github.com/dotnet/net6-mobile-samples,

未來還將添加 macOS 和 Windows 桌面支持,以及除了 XAML 熱多載之外,還將支持 C# 代碼的熱多載,

對于今天已經在使用 Xamarin 構建應用的開發者,將會提供轉換工具和遷移指導幫助遷移到 .NET 6,

MAUI

上圖中,Android 和 iOS 應用直接通過 dotnet 的命令從命令列中啟動,分別運行在模擬器中,代碼利用了 dotnet-runtimeinfo 在控制臺中輸出了運行時的資訊:應用是利用 .NET 的 SDK 開發,在 mono 的運行時之上使用 .NET 的類別庫,

Blazor 桌面應用

Blazor Desktop 將允許開發者利用 Blazor 技術開發混合客戶端程式,將原生 UI 和 Web 技識訓合起來構建原生的客戶端應用,

例如你可以直接將 Blazor 作為組件集成到現有的 WPF 應用當中,下面是幾個例子:

在 macOS 運行的 Blazor 桌面客戶端應用:

blazor-macOS

在 WPF 中集成 Blazor 的混合應用:

blazor-wpf

快速內部回圈

快速迭代開發是任何高效且令人愉悅的平臺的標志,為此微軟啟動了一個新專案:快速內部回圈(fast inner loop),該專案旨在讓應用的構建速度大幅度提高,并提供在運行時修改代碼無需重新編譯和重啟應用,直接熱多載代碼并應用的功能,

幾年來 .NET 一直具有 XAML 熱多載功能,這一次,熱多載功能將不僅局限于 XAML,而是擴展到 C# 和 IL,微軟將定義代碼熱多載模型以讓該功能支持所有型別的 app,這其中的一些功能需要通過改進運行時來做到,屆時 CoreCLR 和 Mono 將一起受益,

最終通過該專案,開發者將能夠非常快的構建專案,并且在除錯運行時直接跳過編譯,通過熱多載功能完成代碼的修改,而無需重新啟動,

ARM64

.NET 將持續改進 ARM64 的支持,

ARM64 的性能改進計劃

.NET 將持續改善在 ARM64 架構上的性能表現,具體可以去這里查看 .NET 6 在此方面的計劃:https://github.com/dotnet/runtime/issues/43629

WPF 支持

WPF 現在支持 Windows ARM64 了,如需反饋相關問題可以前去: https://github.com/dotnet/wpf/issues/4117

wpf-arm64

macOS ARM64 支持

.NET 5 將提供對 macOS ARM64 的 x86_64 模擬器支持,而 .NET 6 將提供對 macOS ARM64 的原生支持,下圖中展示了在 macOS 原生運行 ARM64 的 .NET:

macos-arm64

容器

容器是 .NET 團隊的日常作業,既是構建基礎結構的基礎,又是產品方案,.NET 性能測驗也在容器中完成,

在 .NET 6 中將針對如下專案改進容器支持:

  • 改善容器的縮放支持,并更好地支持 Windows 行程隔離的容器, 我們還計劃了一種針對密度和累加機器性能的新型容器性能測驗,
  • 使用 PGO 減小容器鏡像的大小
  • 通過使用 R2R 版本氣泡來提高啟動和吞吐量性能,
  • 默認情況下,通過使用現代向量指令來提高啟動和吞吐量性能,
  • [高級方案] 為 R2R 合成鏡像啟用大頁面支持

除了第一條之外,上述所有特性都依賴 crossgen2 完成,雖然很多特性和容器沒太多關系,但是 .NET 將會在容器中使用他們,

在某些情況下,例如版本氣泡,容器可能是唯一默認啟用功能的分發工具,

容器的一個重要優點是,與更通用的 .tar.gz,.deb 或 .msi 交付方式相比,可以以更“自以為是”的配置提供 .NET,例如提供性能更高配置的容器,但可能無法在所有情況下都可用(例如在舊硬體上),

.NET 6 鏡像將分別在 Alpine 3.13(或更高)、Debian 11(bullseye)和 Ubuntu 20.04 上構建,

主題:PGO - 利用運行時資訊提升啟動速度和吞吐量性能

本次來介紹一下 PGO 這個主題,后續每個 Preview 都將會介紹一些主題,

PGO(Profile-Guided Optimization) 的目標是優化二進制內的原生代碼,讓其在 CPU 和其他方面的計算機上執行的效率更高,優化代碼可以讓程式速度更快,并能減少記憶體使用和硬碟使用,現在微軟已經在 native runtime 上面使用了 PGO,這是由在 Windows、macOS 和 Linux 上使用的 C++ 編譯器提供,雖然這部分內容很相關并重要,但是并不是這里的 PGO 所說的東西,

這里的 PGO 是指優化 RyuJIT(.NET 的 JIT)產生的本機代碼,Crossgen 和 RyuJIT 已經支持了 PGO,但是在 .NET 6 中將在可用度和性能上大幅改善該特性,

其中一個 PGO 技術是冷熱分離:將最常呼叫的代碼放在一起(熱),不常呼叫的代碼放到另一邊(冷),理性情況下,由于已處于從磁盤加載的頁面的相同物理順序中,接下來一連串的方法呼叫或者基本塊訪問需要的代碼已經被載入到了 CPU 的快取中,這種情況下方法或者塊的呼叫將非常快,除了上述的冷熱之外,還引入了 “非常冷” 這一組,這一組代碼將不會預編譯任何的原生代碼,只會在需要的時候被 JIT 編譯,這么做將能在不犧牲主要性能的情況下減小程式體積,

PGO 這項技術雖然不僅僅只在 .NET 中有所應用,但是該項技術非常不流行,因為做起來非常有難度,而且這類工具通常很笨重,并且在處理程序中需要非常注意細節:開發者必須定期進行“訓練”,在此程序中,需要在各種情況下運行程式,同時工具會收集程式的運行資料,然后把這些資料提供給編譯器,編譯器根據這些資料改善編譯結果,開發者接著去驗證結果,這一系列的程序非常麻煩且令人沮喪,

在 .NET 6 中,將計劃做以下 PGO 相關的支持:

  • 提供一組容易使用的工具用于 PGO 訓練和資料分析
  • 為 .NET 庫公開發布分享訓練資料,以讓其他人能夠使用這些資料
  • 在生產環境中啟用訓練資料收集
  • 在運行時允許 JIT 使用靜態訓練的資料
  • 在運行時允許 JIT 生成和使用動態訓練的資料(不需要手動訓練)

PGO 將期望能得到 10% 的啟動速度提升和吞吐量性能提升,對于計算不敏感的作業負載,提升將更為顯著,

.NET 期望用兩個大版本的時間完成此方面完整的企劃,

TFM

完整的 .NET TFM 將包含如下:

  • net6.0
  • net6.0-android
  • net6.0-ios
  • net6.0-maccatalyst
  • net6.0-macos
  • net6.0-tvos
  • net6.0-windows

通過類似 <TargetFramework>net6.0</TargetFramework> 的方式可以適配到不同的平臺上,

命令列

在 .NET 6 中,對 CLI 也有不少改進,

回應檔案

命令列支持回應檔案,通過回應檔案可以繞過控制臺對于字符數量的限制,同時也能減少用戶反復輸入相同命令的麻煩,

回應檔案的支持已經被添加到 .NET CLI 中,語法是 @file.rsp,而該檔案本身就是簡單的一行文本,會在命令列中被結構化,例如下圖使用回應檔案進行 dotnet build

rsp

新指令

添加了兩個新的指令:

  • dotnet suggest:用于搜索命令,例如 dotnet suggest buil 將回傳 buildbuild-servermsbuild 等搜索結果
  • dotnet parse:用于決議命令,可用來分析為什么輸入的命令有誤等問題

.NET 6 Preview 1 的類別庫新增了一些 API,

System.Numerics 的新數學 API

  • SinCos:用于同時計算 sincos
  • ReciprocalEstimate:用于估算 1 / x
  • ReciprocalSqrtEstimate:用于估算 1 / Sqrt(x)
  • Clamp, DivRem, MinMax 支持 nintnuint
  • AbsSign 支持 nuint
  • DivRem 回傳元組的多型

Windows 訪問控制串列的支持改進

用于操作 Windows ACLs 的包System.Threading.AccessControl 已經被改進,為 EventWaitHandle, MutexSemaphore 加入了新的 OpenExistingTryOpenExisting 方法,允許打開現有的通過特殊 Windows 安全描述符創建的執行緒同步物件,

運行時

.NET 6 Preview 1 的新運行時特性包含 Apple Silicon 支持、crossgen2 以及部分 PGO 改進等等,

可移植執行緒池

.NET 6 通過托管實作,重新實作了 .NET 的執行緒池,并且作為 .NET 默認的執行緒池,

該執行緒池可以在不同平臺(CoreCLR、Mono 等)上提供相同的行為,

如果想要恢復以前用非托管代碼實作的執行緒池,可以指定環境變數 COMPlus_ThreadPool_UsePortableThreadPool=0,不過后續原來的執行緒池實作可能會被移除,

Apple Silicon 支持

.NET 6 Preview 1 開始原生支持 Apple Silicon,但是目前還處于 alpha 狀態,

對于 .NET 6,將同時支持 macOS ARM64 的原生運行以及通過羅塞塔 2 模擬運行 x64 版本的 .NET,

下面是同一臺 macOS ARM64 機器上運行 .NET 5 和 .NET 6 的輸出,你可以看到區別:

rich@MacBook-Air dotnet-runtimeinfo % pwd
/Users/rich/git/core/samples/dotnet-runtimeinfo
rich@MacBook-Air dotnet-runtimeinfo % dotnet run
**.NET information
Version: 5.0.3
FrameworkDescription: .NET 5.0.3
Libraries version: 5.0.3
Libraries hash: c636bbdc8a2d393d07c0e9407a4f8923ba1a21cb

**Environment information
OSDescription: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Jan 22 03:28:00 PST 2021; root:xnu-7195.100.296.111.3~3/RELEASE_ARM64_T8101
OSVersion: Unix 11.0.0
OSArchitecture: X64
ProcessorCount: 8
rich@MacBook-Air dotnet-runtimeinfo % export DOTNET_ROLL_FORWARD=Major
rich@MacBook-Air dotnet-runtimeinfo % export DOTNET_ROLL_TO_PRERELEASE=1
rich@MacBook-Air dotnet-runtimeinfo % dotnet run
**.NET information
Version: 6.0.0
FrameworkDescription: .NET 6.0.0-preview.1.21102.12
Libraries version: 6.0.0-preview.1.21102.12
Libraries hash: 9b2776d48183632662e0be873cef029cdb57f8d6

**Environment information
OSDescription: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Jan 22 03:28:00 PST 2021; root:xnu-7195.100.296.111.3~3/RELEASE_ARM64_T8101
OSVersion: Unix 11.3.0
OSArchitecture: Arm64
ProcessorCount: 8

Apple Silicon

原生支持

蘋果的新芯片相對于其他 ARM64 芯片來說有更嚴格運行要求,其中包括對 JIT 的要求,.NET 6 Preview 1 已經滿足這些要求,

通用二進制(Universal binaries)是發布到蘋果商店的另一個新要求,但是目前 .NET 6 應用并不支持,因此不能發布到蘋果的應用商店,不過這部分也不是大部分 .NET 開發者所需要的,如果需要的話,.NET 會在 .NET 7 重新考慮是否支持通用二進制,

為了支持 Apple Silicon ABI 的要求,.NET 已經做出了一些改進,下面是對應的 Pull Request:

  • Use bytes in fgArgTabEntry
  • Support byte sizes from lowering to codegen
  • Preserve precise argument sizes
  • Use 4-byte stack alignment for hfa<float>
  • Arg alignment

除錯

目前還無法在 Apple Silicon 上面除錯原生 ARM64 的 .NET 程式,這將會在 Preview 3 或之后提供支持,不過通過羅塞塔 2 模擬運行 x64 的運行時是支持除錯的,

已知問題

  • 由于 Apple Silicon 頁面大小為 16K,對于大的堆疊分配,JIT 無法生成清堆疊代碼
  • 可靠性不如 x64 版本的
  • 因為沒有機器所以 macOS ARM64 的 CI 還沒有啟用
  • 還沒有設計同時運行原生 .NET 和模擬 .NET 的方式,因此如果想要在 macOS ARM64 同時使用 .NET 6 和 .NET 5,建議通過 .tar.gz 手動安裝,而不是通過包管理器直接安裝,以便于控制版本
  • .tar.gz 的包被誤報成惡意軟體了

羅塞塔 2 仿真

.NET 5 的 x64 版本目前已經支持通過羅塞塔 2 仿真運行在 macOS ARM64 上,

單檔案應用

在 .NET 6,完成了用于 Windows 和 macOS 的完全單檔案應用支持,此前這一項只支持 Linux,所以在其他平臺即使利用 PublishSingleFile 也還會帶幾個 .NET 的 dll 或者 dylib 檔案,.NET 6 開始,這些檔案都將被靜態鏈接到程式當中,變成真正的單檔案,

當然,這只是對于 runtime 而言的,如果你的程式參考了其他的 native 庫,那么這些庫還是會外帶,而不會被鏈接進去,

macOS 單檔案應用簽名

.NET 6 的單檔案應用現在滿足了蘋果的公證和簽名要求,相關改動可以參考:https://github.com/dotnet/runtime/issues/3671,

Crossgen2

Crossgen2 將代替原有的 crossgen,旨在帶來如下優點:

  • 使 crossgen 更加高效并啟用現有 crossgen 無法啟用的一些特性
  • PGO 相關的計劃取決于 crossgen2,影響 R2R 代碼生成,.NET 6 中有 6 個專案依賴 crossgen2,這個東西非常重要
  • 允許在不同系統和架構之間交叉編譯

目前 .NET 的核心庫 System.Private.Corelib 本身已經使用了 crossgen2 進行預編譯了,后面將會把整個 .NET 自身利用 crossgen2 進行預編譯,

這個專案并不是為了改進性能的,而是為托管 RyuJIT 提供更好的體系結構,在不需要或者不啟動運行時的情況下以“離線”方式生成代碼,以便更好地支持交叉編譯,

動態 PGO

動態 PGO是 .NET 正在探索和啟用的PGO模式之一,一方面,可以將其視為“無需訓練” 的 PGO,在文章的前面,我描述了 PGO 的使用程序,而動態PGO的優點是不需要任何這些,但是缺點是程序需要更長的時間才能達到最佳性能,

另一方面,動態 PGO 可以被認為是當今分層編譯所使用的更為簡單(且效果較差)的策略的替代品,

最引人注目案例中,動態 PGO 和靜態 PGO 組合到了一起,在運行時, JIT 可以細化一小部分經過靜態編譯的 PGO 優化代碼,以提供最大的好處,

例如,JIT 可以注意到,在到目前為止已加載的程序中,只有一個類實作了給定的介面,然后,JIT 可以生成通過類直接呼叫的代碼,而不是通過介面間接呼叫,

這種經典的編譯器技術稱為去虛擬化,它通過消除方法呼叫中的間接操作并啟用行內來提高性能,

作為啟用動態 PGO 的一部分,.NET 已經做出了如下改動:

  • Guarded devirtualization:通過類概要檔案和針對型別別的探針啟用受保護的去虛擬化
  • Flowgraph visualizations:帶有組態檔資料的流程圖的圖形轉儲
  • Redundant branch elimination:優化完全確定分支結果的分支
  • Enable CSE for PGO scenarios:為 PGO 引入的型別測驗啟用 CSE

ARM64 性能

Preview 1 中包含了以下改進:

  • Stack frame zeroing:使用 SIMD 清零初始幀

arm64-perf

上圖展示了改進帶來的影響,數值越低越好,綠色線是改進之后的,橘色是另一個實驗性改進的,藍色是原來的,

硬體加速的 struct

struct 值型別是 .NET 中很重要的性能工具,被頻繁使用,但是此前 struct 并沒有在 JIT 中得到應得的優化,在 .NET 5 和 .NET 6 中,將針對 struct 進行性能優化,一部分是確保 struct 能夠被加載到 CPU 暫存器中進行訪問,

Preview 1 中包含如下改進:

  • Struct promotion for HFAs:Struct promotion for HFA and non-HFA multireg args on x64 and Arm64
  • Enregister HFAs:Enregister HFAs and other structs with matching fields

結語

以上就是個人認為值得關注的 .NET 6 Preview 1 帶來的新特性了,后續還會有十個左右的預覽版本,會包含更多的新增和改進內容,敬請期待吧,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/260836.html

標籤:.NET Core

上一篇:c#_HttpClient_application/x-www-form-urlencoded_引數轉義

下一篇:日志框架NLog之將日志發送到郵件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more