using System.Collections.Generic;
using System.Threading.Tasks;
const int maxThreads = 16;
public static void Main()
Task.Run(async () => await ProcessFiles()).GetAwaiter().GetResult();
public async static Task ProcessFiles()
var runningTasks = new List<Task>();
var fileQueue = new Queue<string>();
while (fileQueue.Count > 0)
while (runningTasks.Count < maxThreads && fileQueue.Count > 0)
runningTasks.Add(ProcessFileAsync(fileQueue.Dequeue()));
var completedTask = await Task.WhenAny(runningTasks).ConfigureAwait(false);
runningTasks.Remove(completedTask);
await Task.WhenAll(runningTasks).ConfigureAwait(false);
public static async Task ProcessFileAsync(string fileName)
var fileData = await ReadFileAsync(fileName).ConfigureAwait(false);
var updatedFileData = await Task.Run(() => UpdateFileAsync(fileData)).ConfigureAwait(false);
await WriteFileAsync(fileName, updatedFileData).ConfigureAwait(false);
private static async Task WriteFileAsync(string fileName, byte[] updatedFileData)
using (var fs = new System.IO.FileStream(fileName, System.IO.FileMode.Truncate, System.IO.FileAccess.Write, System.IO.FileShare.Write, 16384, true))
await fs.WriteAsync(updatedFileData, 0, updatedFileData.Length).ConfigureAwait(false);
private static byte[] UpdateFileAsync(byte[] fileData)
private static async Task<byte[]> ReadFileAsync(string fileName)
using (var fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read, 16384, true))
buff = new byte[fs.Length];
await fs.ReadAsync(buff, 0, (int)fs.Length).ConfigureAwait(false);