gpt4 book ai didi

c# - 我应该在哪里启动 ASP.NET Core 中的持久后台任务?

转载 作者:太空狗 更新时间:2023-10-30 00:48:17 25 4
gpt4 key购买 nike

在我的 Web 应用程序 (ASP.NET Core) 中,我想在后台运行一个正在监听远程服务器的作业,计算一些结果并将其推送到 Pusher(一个 websocket)上的客户端。

我不确定应该从哪里开始这项任务。目前我在结束时开始

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)

Startup.cs

但我认为这有问题,在名为“Configure”的方法中启动后台作业没有意义。我期待在某处找到 Start 方法

另外,当我尝试使用 EF Core 来 generate initial database migration file ,它实际上执行该方法并开始我的任务..这显然没有任何意义:

dotnet ef migrations add InitialCreate

从控制台运行它会创建迁移代码,这些代码将用于根据我的数据模型在 SQL Server 上创建数据库。

为什么没有一种方法可以让我开始一些任务?我不希望它在一个单独的进程中,它真的不需要自己的进程,它本质上是网络服务器的一部分,因为它确实通过 websocket 与客户端(浏览器)通信,所以这是有道理的将其作为网络服务器的一部分运行。

最佳答案

我相信你正在寻找这个

https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background-tasks-in-microservices-with-ihostedservice-and-the-backgroundservice-class-net-core-2-x/

我参加了一场 2 小时的自称获奖的黑客马拉松比赛,以学习一些技巧。

https://github.com/nixxholas/nautilus

您可以在此处引用注入(inject)并从那里实现抽象。

许多 MVC 项目并不是真正需要运行持久后台任务。这就是为什么您没有看到它们通过模板被烘焙到一个全新的项目中。最好为开发人员提供一个界面,让他们点击并继续操作。

此外,关于为此类后台任务打开套接字连接,我还没有为此建立解决方案。据我所知/所做的,我只能向连接到我自己的 socketmanager 的客户端广播有效负载,因此您必须到别处寻找。如果 IHostedService 中有任何关于 websockets 的内容,我肯定会发出哔哔声。

好吧,不管怎样,这就是发生的事情。

把它放在你项目的某个地方,它更像是一个接口(interface),供你重载以创建你自己的任务

/// Copyright(c) .NET Foundation.Licensed under the Apache License, Version 2.0.
/// <summary>
/// Base class for implementing a long running <see cref="IHostedService"/>.
/// </summary>
public abstract class BackgroundService : IHostedService, IDisposable
{
protected readonly IServiceScopeFactory _scopeFactory;
private Task _executingTask;
private readonly CancellationTokenSource _stoppingCts =
new CancellationTokenSource();

public BackgroundService(IServiceScopeFactory scopeFactory) {
_scopeFactory = scopeFactory;
}

protected abstract Task ExecuteAsync(CancellationToken stoppingToken);

public virtual Task StartAsync(CancellationToken cancellationToken)
{
// Store the task we're executing
_executingTask = ExecuteAsync(_stoppingCts.Token);

// If the task is completed then return it,
// this will bubble cancellation and failure to the caller
if (_executingTask.IsCompleted)
{
return _executingTask;
}

// Otherwise it's running
return Task.CompletedTask;
}

public virtual async Task StopAsync(CancellationToken cancellationToken)
{
// Stop called without start
if (_executingTask == null)
{
return;
}

try
{
// Signal cancellation to the executing method
_stoppingCts.Cancel();
}
finally
{
// Wait until the task completes or the stop token triggers
await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite,
cancellationToken));
}
}

public virtual void Dispose()
{
_stoppingCts.Cancel();
}
}

实际使用方法如下

public class IncomingEthTxService : BackgroundService
{
public IncomingEthTxService(IServiceScopeFactory scopeFactory) : base(scopeFactory)
{
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{

while (!stoppingToken.IsCancellationRequested)
{
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<NautilusDbContext>();

Console.WriteLine("[IncomingEthTxService] Service is Running");

// Run something

await Task.Delay(5, stoppingToken);
}
}
}
}

如果您注意到了,那里有额外的好处。您必须使用服务范围才能访问数据库操作,因为它是单例。

将你的服务注入(inject)

// Background Service Dependencies
services.AddSingleton<IHostedService, IncomingEthTxService>();

关于c# - 我应该在哪里启动 ASP.NET Core 中的持久后台任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com