繁体   English   中英

在 ASP.NET 中运行单独的进程 核心 Web 最小 API

[英]Running separate process in ASP.NET Core Web Minimal API

我有一个长时间运行的进程,我想添加一个 REST api 到。 通过 API 我希望能够检查长时间运行过程中变量的值。

我使用最小 API 组合了一个概念证明:

public class Program
{
    public static int val = 0;
    public static object locker = new object();


    public static void Main(string[] args)
    {
        Task.Run(() =>
        {
            while (true)
            {
                lock (locker)
                {
                    val++;
                }
                Thread.Sleep(100);
            }
        });

        var builder = WebApplication.CreateBuilder(args);
        var app = builder.Build();

        app.MapGet("/", () => 
        {
            lock (locker)
                return val;
        });

        app.Run();
    }
}

我的想法是让我长时间运行的进程的代码在 Task.Run 中运行。 我这样做是对的吗? 我尝试做的事情是否有任何潜在的陷阱/陷阱?

您可以创建一个包含 state 的服务,您可以从 API 访问该服务。windows 服务/托管服务非常适合“长时间运行的进程”,它可以托管您的 API: 文档

价值服务.cs

为长时间运行的进程实施BackgroundService

public class ValueService : BackgroundService
{
    private int _val;

    public int Value
    {
        get { return _val; }
        set { _val = value; }
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {        

        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
            Value++;
        }
    }
}

程序.cs

注册您的服务并注册服务提供商的检索。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<ValueService>();
builder.Services.AddHostedService(p => p.GetService<ValueService>()!);

var app = builder.Build();  
    

在你的 API 中注入服务:

app.MapGet("/", (ValueService valueService) =>
{
    return valueService.Value;       
});

app.Run();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM