整理代码
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
using ConsoleApp2.Const;
|
||||
|
||||
using ConsoleApp2.HostedServices.Abstractions;
|
||||
using ConsoleApp2.Options;
|
||||
using ConsoleApp2.Services;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace ConsoleApp2.HostedServices;
|
||||
|
||||
/// <summary>
|
||||
@@ -34,42 +32,32 @@ public class OutputService : IOutputService
|
||||
_transformOptions = transformOptions;
|
||||
_errorRecorder = errorRecorder;
|
||||
}
|
||||
|
||||
public async Task ExecuteAsync(TasksOptions tasksOptions, DataRecordQueue consumerQueue, ProcessContext context, CancellationToken cancellationToken)
|
||||
private int _runingTaskCount;
|
||||
public int RuningTaskCount
|
||||
{
|
||||
|
||||
_logger.LogInformation("***** Mysql output service started *****");
|
||||
|
||||
get => _runingTaskCount;
|
||||
}
|
||||
public void DoTask() => Interlocked.Increment(ref _runingTaskCount);
|
||||
public void FinishTask() => Interlocked.Decrement(ref _runingTaskCount);
|
||||
public void ExecuteAsync(TasksOptions tasksOptions, DataRecordQueue consumerQueue, ProcessContext context, CancellationToken cancellationToken)
|
||||
{
|
||||
if (context.IsTransformCompleted == false && consumerQueue.Count < tasksOptions.OutPutOptions.FlushCount) return;
|
||||
if (RuningTaskCount >= tasksOptions.OutPutOptions.OutPutTaskCount ) return;
|
||||
var records = new List<DataRecord>();
|
||||
while (!context.IsTransformCompleted || consumerQueue.Count > 0)
|
||||
{
|
||||
if (!consumerQueue.TryDequeue(out var record)) continue;
|
||||
records.Add(record);
|
||||
if (records.Count >= tasksOptions.OutPutOptions.FlushCount)
|
||||
{
|
||||
var temp= new List<DataRecord>(records);
|
||||
ThreadPool.QueueUserWorkItem(async (queueState) =>
|
||||
{
|
||||
await FlushAsync(temp);
|
||||
});
|
||||
|
||||
records.Clear();
|
||||
}
|
||||
if (_context.GetExceptions().Count > 0)
|
||||
{
|
||||
_logger.LogInformation("***** Csv output thread is canceled *****");
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < tasksOptions.OutPutOptions.FlushCount; i++)
|
||||
{
|
||||
if (consumerQueue.TryDequeue(out var record)) records.Add(record);
|
||||
else break;
|
||||
}
|
||||
if (records.Count > 0)
|
||||
{
|
||||
var temp = new List<DataRecord>(records);
|
||||
ThreadPool.QueueUserWorkItem(async (queueState) =>
|
||||
{
|
||||
await FlushAsync(temp);
|
||||
DoTask();
|
||||
await FlushAsync(records);
|
||||
FinishTask();
|
||||
});
|
||||
records.Clear();
|
||||
_logger.LogInformation("***** Mysql output thread completed *****");
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user