c# - 在 ASP.NET Core Web Minimal API 中运行单独的进程

标签 c# asp.net-core asp.net-web-api task-parallel-library asp.net-core-minimal-hosting-model

我有一个长时间运行的进程,我想向其添加 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 中运行。我这样做是对的吗?我尝试做的事情是否有任何潜在的陷阱/问题?

最佳答案

您可以创建一个保存状态的服务,并且可以从您的 API 访问该服务。 Windows 服务/托管服务非常适合“长时间运行的进程”,它可以托管您的 API:documentation .

ValueService.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++;
        }
    }
}

Program.cs

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

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

var app = builder.Build();  
    

在您的 API 中注入(inject)服务:

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

app.Run();

关于c# - 在 ASP.NET Core Web Minimal API 中运行单独的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74468294/

相关文章:

c# - 基于查询字符串参数名的路由

android - 来自移动设备请求的 IP 地址

c# - 两个模型之间的多重关系

asp.net-core - ASP.NET Core 2.2 中的路由本地化

c# - asp.net 应用程序在本地主机上识别用户,但在没有硬编码用户名/密码的情况下无法在服务器上识别用户

angular - 即使在使用 .NET Core 和 Angular 客户端启用它之后,CORS 错误仍然会发生

c# - 如何从 Startup.cs 中写入日志?

asp.net-web-api - 来自 ASP.NET Web API 的错误 HTTP 响应代码

c# - StructureMap 中的命名实例和默认实例?

c# - 类似于 Joomla/Mambo/Drupal 的 c# 操作系统项目有哪些替代方案?