0

DistributedLock nugetから分散ロックを試しています。

私が使用するコードスニペットは次のとおりです。

class Program
{
    private static SqlConnection _sqlConn = new SqlConnection("my connection string");
   
    static void Main(string[] args)
    {
        int pid;
        using (var p = Process.GetCurrentProcess()) { pid = p.Id; }
        TestSqlLocking(pid).Wait();
    }

    private static async Task TestSqlLocking(int processId)
    {
        _sqlConn.Open();
        var t1 = DoWorkAsyncWithSqlLock($"Process {processId} Client 1");
        var t2 = DoWorkAsyncWithSqlLock($"Process {processId} Client 2");
        var t3 = DoWorkAsyncWithSqlLock($"Process {processId} Client 3");
        var t4 = DoWorkAsyncWithSqlLock($"Process {processId} Client 4");
        await Task.WhenAll(t1, t2, t3, t4);
    }

    private static async Task DoWorkAsyncWithSqlLock(string client)
    {
        var sqlDistributedLock = new SqlDistributedLock("myLock", _sqlConn);
        Console.WriteLine($"SQL Before taking the lock for client [{client}]");
        await using (await sqlDistributedLock.AcquireAsync(TimeSpan.FromSeconds(10)))
        {
            Console.WriteLine($"SQL After taking the lock and doing some work for client [{client}]");
            await Task.Delay(1000);
            Console.WriteLine($"SQL After doing some work and releasing lock for client [{client}]");
        }
    }
}

問題は、最初のロックを取得した後、解放されないかのように、常にタイムアウトになることです。廃棄後はロックが解除されるとのことですが。しかし、それは起こっていません。2 番目のタスクはロックに入ることができません。

私が得る出力は次のとおりです。

SQL Before taking the lock for client [Process 8864 Client 1]
SQL Before taking the lock for client [Process 8864 Client 2]
SQL Before taking the lock for client [Process 8864 Client 3]
SQL Before taking the lock for client [Process 8864 Client 4]
SQL After taking the lock and doing some work for client [Process 8864 Client 1]
SQL After doing some work and releasing lock for client [Process 8864 Client 1]

その後、タイムアウトが発生します。

4

0 に答える 0