Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在ASP NET核心中执行完全异步的操作_Asp.net Core_Redis_Task Parallel Library_Publish Subscribe - Fatal编程技术网

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不太熟悉,但我会尝试使用过滤日志。