63 lines
2.4 KiB
C#
63 lines
2.4 KiB
C#
using System.Threading.Channels;
|
|
using Admin.NET.Core.Ai.Services.DataBase.Dto;
|
|
using Admin.NET.Core.Ai.Enums;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
namespace Admin.NET.Core.Ai.Services.DataBase;
|
|
|
|
public class ChatChannelManager : ISingleton
|
|
{
|
|
private readonly Channel<DataActionInput> _channel;
|
|
private readonly ILogger<ChatChannelManager> _logger;
|
|
private readonly IServiceProvider _serviceProvider;
|
|
|
|
public ChatChannelManager(
|
|
ILogger<ChatChannelManager> logger,
|
|
IServiceProvider serviceProvider)
|
|
{
|
|
_logger = logger;
|
|
_serviceProvider = serviceProvider;
|
|
_channel = Channel.CreateBounded<DataActionInput>(new BoundedChannelOptions(1000)
|
|
{
|
|
FullMode = BoundedChannelFullMode.Wait
|
|
});
|
|
|
|
_ = Task.Run(async () =>
|
|
{
|
|
while (await _channel.Reader.WaitToReadAsync())
|
|
{
|
|
var action = await _channel.Reader.ReadAsync();
|
|
try
|
|
{
|
|
// 在需要时创建新的作用域
|
|
using var scope = _serviceProvider.CreateScope();
|
|
var chatChannelActionService = scope.ServiceProvider.GetRequiredService<ChatChannelActionService>();
|
|
|
|
switch (action.ActionType)
|
|
{
|
|
case ChatActionEnums.Append:
|
|
await chatChannelActionService.AppendAsync(action.Item);
|
|
break;
|
|
case ChatActionEnums.AppendItem:
|
|
await chatChannelActionService.AppendItemAsync(action.Item);
|
|
break;
|
|
case ChatActionEnums.DeleteAll:
|
|
await chatChannelActionService.DeleteAllAsync(action.Item);
|
|
break;
|
|
case ChatActionEnums.RenameSummary:
|
|
await chatChannelActionService.RenameSummaryAsync(action.Item);
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "处理数据库操作时发生错误");
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
public ChannelReader<DataActionInput> ActionReader => _channel.Reader;
|
|
public ChannelWriter<DataActionInput> ActionWriter => _channel.Writer;
|
|
}
|