SemaphoreSlim(1, 1) WaitAsync
От: #John https://github.com/ichensky
Дата: 28.12.20 11:53
Оценка: 7 (1)
Здравствуйте,

почему в данном примере 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();
            }
        }

    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.