rksoftware

Visual Studio とか C# とかが好きです

C# 13 を試す 新しいロックオブジェクト

C# 13 の 新しいロックオブジェクト を試してみます。
元ネタはこちら

learn.microsoft.com

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 ステートメントと比べてコードが短くなるわけではないので忘れてしまいそうです。
しっかり覚えて使いこなしましょう。