Здравствуйте,
почему в данном примере SemaphoreSlim(1, 1) с WaitAsync не работает как `lock`
программа выводит разный результат. (.net 5)
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static SemaphoreSlim s = new SemaphoreSlim(1, 1);
const int operations = 10000;
static int balace = 0;
static async Task Main(string[] args)
{
var tasks = new List<Task>();
for (int index = 0; index < 10; index++)
{
balace = 0;
for (int i = 0; i < operations; i++)
{
tasks.Add(Task.Factory.StartNew(add));
}
for (int i = 0; i < operations; i++)
{
tasks.Add(Task.Factory.StartNew(remove));
}
await Task.WhenAll(tasks);
Console.WriteLine(balace);
}
Console.ReadLine();
}
static async Task add()
{
await s.WaitAsync();
try
{
balace++;
await Task.Yield();
}
finally
{
s.Release();
}
}
static async Task remove()
{
await s.WaitAsync();
try
{
balace--;
await Task.Yield();
}
finally
{
s.Release();
}
}
}
}