Сценарий:
При использовании асинхронной задачи для выполнения запросов приложение успешно устанавливает около 300 соединений с CockroachDB и достигает ожидаемой пропускной способности. Однако это приводит к значительному использованию памяти приложением.
Код: Выделить всё
Task.Run(() => ReturnImpactedRecordsFromQuery(procedureName, DatabaseType, querytype, parameters));
Код: Выделить всё
await TaskController.QueueTask(async () =>
{
cnt = await ReturnImpactedRecordsFromQuery(procedureName, databaseType, queryType, parameters);
});
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.Threading.Channels;
using System.Threading.Tasks;
namespace Procedures
{
public static class TaskController
{
private static Channel channel = Channel.CreateBounded(new BoundedChannelOptions(Math.Max(1, Environment.ProcessorCount * 1000))
{
FullMode = BoundedChannelFullMode.Wait // Wait when the channel is full
});
static TaskController()
{
Task.Run(ProcessChannelAsync);
}
public static void QueueTask(Func task)
{
// Enqueue the work to the channel
channel.Writer.TryWrite(task);
}
private static async Task ProcessChannelAsync()
{
while (await channel.Reader.WaitToReadAsync())
{
while (channel.Reader.TryRead(out var workItem))
{
await workItem();
}
}
}
}
}
Мы будем очень признательны за любые предложения, рекомендации или примеры кода!
Подробнее здесь: https://stackoverflow.com/questions/792 ... ern-in-net
Мобильная версия