我有一个长时间运行的进程,我想向其添加 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/