menuTicketing

مكتبة Ticketing لـ C#

GitHub

المستودع

bash
powershell

أمثلة

مثال بسيط

واجهة برمجية قائمة على async/await. تتصل بخادم واحد، وتحجز مفتاحًا ثم تعيده فورًا.

csharp
var wait = TimeSpan.FromSeconds(5);
var lease = TimeSpan.FromSeconds(30);

await using var broker = TicketBroker.Connect(["127.0.0.1:5225"]);
await broker.WaitReadyAsync(TimeSpan.FromSeconds(5));

var ticket = await broker.AcquireAsync("key", wait, lease);
await ticket.ReleaseAsync();

Console.WriteLine("pass");

مثال التزامن (قفل موزع)

مثال يتحقق من أن عدة مهام تُجري إيداعات وسحوبات متكررة عبر قفل خاص بكل حساب دون تعارض، وأن الرصيد يعود دائمًا إلى قيمته الأولية.

csharp
private async Task Transaction(int account, long delta)
{
    var key = $"account-{account}";

    Ticket ticket;
    try
    {
        ticket = await _broker.AcquireAsync(key, Wait, Lease);
    }
    catch (Exception e)
    {
        _log.LogError($"account {account} acquire failed: {e.Message}");
        return;
    }

    await using var _ = ticket; // إرجاع تلقائي في الخلفية عند مغادرة النطاق

    var before = _balances[account];
    await Task.Yield();
    var after = before + delta;
    _balances[account] = after;

    var (action, sign) = delta < 0 ? ("withdraw", '-') : ("deposit", '+');
    _log.LogInformation($"account {account} {action} {sign}${Amount} -> ${after}");
}

راجع الأمثلة الكاملة في ExampleTest.cs, ExampleBankTest.cs, BenchTest.cs.