C# 13 の 新しいロックオブジェクト を試してみます。
元ネタはこちら
System.Threading.Lock というクラスが追加されたようですね。
いくつか機能はあるようですが、使い方はこんな感じのようです。ここでは 2 種類の使い方を書いています。
ロックが利いているか確認するために System.Diagnostics.Stopwatch クラスを使いつつ、2 つの処理を書いているため少し長いコードになっています。頑張って読んでください。
var sw = new System.Diagnostics.Stopwatch(); sw.Start(); // CA2252 アセンブリを使用する前に、プレビュー機能を選択する必要があります。 var _lockObj = new System.Threading.Lock(); Enumerable.Range(0, 10).AsParallel().Select(x => { _lockObj.Enter(); try { System.Threading.Thread.Sleep(100); Console.WriteLine($"{x} : {sw.ElapsedMilliseconds}"); } finally { _lockObj.Exit(); } return x; }).ToArray(); Enumerable.Range(10, 10).AsParallel().Select(x => { using (_lockObj.EnterScope()) { System.Threading.Thread.Sleep(100); Console.WriteLine($"{x} : {sw.ElapsedMilliseconds}"); } return x; }).ToArray();
■ 実行結果
7 : 206 9 : 318 0 : 435 5 : 538 4 : 651 6 : 753 2 : 856 8 : 972 1 : 1086 3 : 1202 19 : 1321 17 : 1436 10 : 1538 18 : 1653 12 : 1754 14 : 1870 15 : 1986 16 : 2087 11 : 2203 13 : 2319
■ プレビュー機能
この機能はプレビュー機能ということで、プレビュー機能の使用をプロジェクトに設定したければなりません。プレビュー版の言語バージョンでなくプレビュー機能です。すこし悩んでしまいました。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <LangVersion>Preview</LangVersion> <EnablePreviewFeatures>true</EnablePreviewFeatures> </PropertyGroup> </Project>
ここの <EnablePreviewFeatures>true</EnablePreviewFeatures>
■ 使いこなしましょう。
lock ステートメントと比べてコードが短くなるわけではないので忘れてしまいそうです。
しっかり覚えて使いこなしましょう。