У меня есть решение .NET Core Web API.В каждом вызове мне нужно выполнить некоторые операции с базой данных.Проблема в том, что несколько соединений БД открываются и закрываются.Поэтому, чтобы избежать этого, я хочу реализовать Очередь объектов для отправки в базу данных, а затем хочу, чтобы отдельный поток выполнял операцию БД.Я попробовал некоторый код, как показано ниже.Но здесь Поток потребителя никогда не выполняет назначенную функцию.Для Producer отдельного потока нет, я просто наполняю очередь объектом.Какие модификации я должен сделать?Нужны некоторые рекомендации, так как я новичок в Threading.
public static class BlockingQueue
{
public static Queue<WebServiceLogModel> queue;
static BlockingQueue()
{
queue = new Queue<WebServiceLogModel>();
}
public static object Dequeue()
{
lock (queue)
{
while (queue.Count == 0)
{
Monitor.Wait(queue);
}
return queue.Dequeue();
}
}
public static void Enqueue(WebServiceLogModel webServiceLog)
{
lock (queue)
{
queue.Enqueue(webServiceLog);
Monitor.Pulse(queue);
}
}
public static void ConsumerThread(IConfiguration configuration)
{
WebServiceLogModel webServiceLog = (WebServiceLogModel)Dequeue();
webServiceLog.SaveWebServiceLog(configuration);
}
public static void ProducerThread(WebServiceLogModel webServiceLog)
{
Enqueue(webServiceLog);
Thread.Sleep(100);
}
}
Я создал и запустил тему в StartUp.cs:
public Startup(IConfiguration configuration)
{
Thread t = new Thread(() => BlockingQueue.ConsumerThread(configuration));
t.Start();
}
В Controller я написал код для подачи в очередь:
[HttpGet]
[Route("abc")]
public IActionResult GetData()
{
BlockingQueue.ProducerThread(logModel);
return StatusCode(HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound, ApplicationConstants.Message.NoBatchHistoryInfo);
}