using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; namespace ActionBlockTest { public class Worker : BackgroundService { private readonly ILogger _logger; private ActionBlock actionBlock; public Worker(ILogger logger) { _logger = logger; } public override Task StartAsync(CancellationToken cancellationToken) { FileStream fileStream = new FileStream("./test.txt", FileMode.OpenOrCreate); fileStream.Seek(0, SeekOrigin.Current); StreamWriter streamWriter = new StreamWriter(fileStream); for (int i = 0; i < 2000; i++) { streamWriter.WriteLine("{\"seq\": \"" + i + "\",\"camName\": \"¿ØÖÆÊÒ_Ïñ»ú1_ǹ»ú\",\"presetCode\": \"1\"},"); } streamWriter.Flush(); streamWriter.Close(); actionBlock = new ActionBlock( async e => { Task.Delay(1000).Wait(); Console.WriteLine(e); }, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 1, MaxMessagesPerTask = 10 } ); return base.StartAsync(cancellationToken); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { int index = 0; while (!stoppingToken.IsCancellationRequested) { //_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); actionBlock.Post(index++); MemoryStream memoryStream = new MemoryStream(); StreamWriter streamWriter = new StreamWriter(memoryStream); await Task.Delay(10, stoppingToken); } } } }