如何在asp net内核中执行完全异步的操作

taor4pac  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(324)

你好,我想做一个跟踪日志为我的一些朋友 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;
    }

}

现在真正的问题来了。我该如何为我的孩子制造最小的脚印 Publisher 。我提出了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 方法类超出范围
尝试3个concurrentqueue为的单例对象 Tasks 排队的人。这不会超出范围,但我什么时候才能清除这些项目?

public class Publisher{
     private ConcurrentQueue<Task> Queue;
     public async Task PublishAsync(object obj){
         this.Queue.Enqueue();
     }
}

p、 我想在一个公共的地方发布这些日志。从那个地方开始,目标是发布到一个 Redis 使用发布子功能的数据库。我应该给redis写信吗?

efzxgjgh

efzxgjgh1#

您好,我正在尝试为我的一些api终结点创建跟踪日志。这些日志是在调用终结点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响我的常规逻辑的性能。
我强烈建议您使用一个现有的、经过全面测试的日志库,其中有许多具有现代功能,如语义日志和异步兼容的隐式状态。
现代日志库通常采用单例设计,日志保存在内存中(日志方法是同步的)。然后有一个单独的“处理器”将这些消息发布到收集器。如果您坚持要编写自己的日志框架(为什么?),我建议您采用与所有其他非常成功的日志框架相同的方法。

相关问题