C# 多线程使用

84 阅读1分钟

List tasks = new List(); int maxTaskCount = 10; SemaphoreSlim semaphore = new SemaphoreSlim(maxTaskCount); for (var i = 0; i < 30; i++) { await semaphore.WaitAsync(); int index = i; // 避免闭包捕获循环变量的问题 tasks.Add(Task.Run(async () => { //任务内容 try { using (FileStream fileStream = new FileStream(ls[0], FileMode.Open, FileAccess.Read)) { using (MemoryStream stream = new MemoryStream()) {

                 await fileStream.CopyToAsync(stream);
                 RardarHelper rd = new RardarHelper();
                 rd.DecodeDiamond_CR_131(stream, _webHostEnvironment.WebRootPath, (index * 6).ToString());
             }
         }
     }
     finally
     {
         semaphore.Release();
     }
 }));
 if (tasks.Count > maxTaskCount)
 {
     // 等待任何一个完成,不会阻塞当前线程
     await Task.WhenAny(tasks);
     // 排除掉已完成的任务
     tasks.RemoveAll(t => t.IsCompleted);
 }

} // 等待所有任务完成 await Task.WhenAll(tasks);