Asp.net core 如何在ASP NET核心中执行完全异步的操作
您好,我正在尝试为我的一些Asp.net core 如何在ASP NET核心中执行完全异步的操作,asp.net-core,redis,task-parallel-library,publish-subscribe,Asp.net Core,Redis,Task Parallel Library,Publish Subscribe,您好,我正在尝试为我的一些API端点创建跟踪日志。这些日志是在调用端点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响我通常逻辑的性能 我曾想过要有一个组件,它是可注入的,在生成日志时可以在端点的任何位置调用。问题是我似乎没有找到合适的异步解决方案: 不需要因延迟而受阻的重要服务 public interface IImportantInterface { Task DoSomethingUndistrubedAsync(string value); } **Wrapper
API
端点创建跟踪日志。这些日志是在调用端点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响我通常逻辑的性能
我曾想过要有一个组件,它是可注入的,在生成日志时可以在端点的任何位置调用。问题是我似乎没有找到合适的异步解决方案:
不需要因延迟而受阻的重要服务
public interface IImportantInterface
{
Task DoSomethingUndistrubedAsync(string value);
}
**Wrapper around Redis pub-sub**
public interface IIOService{
Task PublishAsync( object obj);
}
控制器
public class Controller
{
private IImportantInterface importantService;
private Publisher publisher;
[HttpPost]
public async Task SomeEndpointAsync(){
this.publisher.Publish([some_log]);
await this.importantService.DoSomethingUndisturbedAsync([something]);
}
public Controller(IImportantInterface importantService)
{
this.importantService=importantService;
}
}
现在,真正的问题来了。我如何使我的出版商的足迹最小。我提出了3种方案,但其中两种方案由于超出范围而不可行:
尝试1
任务作用域为方法的临时服务:
public class Publisher{
private IIOService writeService{get;set;}
public async Task PublishAsync(object obj){
Task t1=Task.Run(async()=>await writeService.PublishAsync(obj)); //t1 might not finished when method exits
}
}
在方法结束时,任务t1可能无法完成
尝试2
嵌入瞬态服务的任务
public class Publisher{ //publisher might get discarded when calling controller gets out of scope
private Task t1;
private IIOService writeService{get;set;}
public async Task PublishAsync(object obj){
t1=Task.Run(async ()=> this.IIOService.writeService(obj));
}
}
现在,任务将不会在方法作用域之后被收集,但在调用的Controller
method类超出作用域时,它可能不会完成
尝试3次
Singleton对象,其ConcurrentQueue的任务
已排队。
这不会超出范围,但我什么时候才能清除项目
public class Publisher{
private ConcurrentQueue<Task> Queue;
public async Task PublishAsync(object obj){
this.Queue.Enqueue();
}
}
公共类发布程序{
私有并发队列;
公共异步任务PublishAsync(对象obj){
this.Queue.Enqueue();
}
}
p.S我想在公共位置发布这些日志。从该位置开始,目标是使用发布子功能发布到Redis
数据库。
我应该给Redis写信吗
您好,我正在尝试为我的一些API端点创建跟踪日志。这些日志是在调用端点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响常规逻辑的性能
我强烈建议您使用一个现有的、经过全面测试的日志库,其中有许多具有现代功能,如语义日志和异步兼容隐式状态
现代日志库通常采用单例设计,日志保存在内存中(日志记录方法是同步的)。然后有一个单独的“处理器”,将这些消息发布到收集器。如果您坚持编写自己的日志框架(为什么?),我建议您采用与所有其他非常成功的日志框架相同的方法
您好,我正在尝试为我的一些API端点创建跟踪日志。这些日志是在调用端点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响常规逻辑的性能
我强烈建议您使用一个现有的、经过全面测试的日志库,其中有许多具有现代功能,如语义日志和异步兼容隐式状态
现代日志库通常采用单例设计,日志保存在内存中(日志记录方法是同步的)。然后有一个单独的“处理器”,将这些消息发布到收集器。如果您坚持编写自己的日志框架(为什么?),我建议您采取与所有其他非常成功的日志框架相同的方法。我已经在使用Serilog
来记录一般的东西,但是我需要在Redis
频道中发布这个特殊的日志。然后,我会为Redis编写一个Serilog接收器。或者。但是Serilog
如何知道将普通日志写入Destination1
和special
日志写入Redis
?我对Serilog不太熟悉,但是我会尝试使用过滤。我已经在使用Serilog
来记录一般的东西,但是我需要在Redis
频道中发布这个special
日志。然后我会为Redis写一个Serilog接收器。或者。但是Serilog
如何知道将普通日志写入Destination1
和special
日志写入Redis
?我对Serilog不太熟悉,但我会尝试使用过滤日志。