2021年7月4日 星期日

c# Task 多執行緒

以前太淺再跑多執行緒都沒再限制Task的數量
所以一跑下去整台主機就卡給你看
因為把資源通通吃光了,那c#怎麼控制你想要的數量呢

使用SemaphoreSlim
 
class Program
    {
        private static readonly SemaphoreSlim Locker = new SemaphoreSlim(5);

        static async Task Main(string[] args)
        {
            List<Task> tasks = new List<Task>();
            for (int i = 0; i < 100; i++)            
                tasks.Add(Task.Run(() => TaskRun()));

            await Task.WhenAll(tasks);
        }

        public static Task TaskRun()
        {
            Locker.Wait();
            return Task.Run(async () =>
            {
                await Task.Run(() =>
                {
                    Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}_Do work.");
                    Thread.Sleep(3000);
                })
                .ConfigureAwait(false);
                Locker.Release();
            });
        }
    }

我起了100個Task因為使用SemaphoreSlim限制每次只跑5個執行緒
所以每次最多就會執行5個,這樣就不會狂跑把主機資源都吃光光

沒有留言:

張貼留言