0

当一个线程被创建为用 asp.net webform 或 .Net Core Web 编写的项目的任务并将其添加到服务器时,它会在一段时间后停止运行,而不会出现任何原因或异常。

Task.Factory.StartNew(async () =>
{
    //...
}, _cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);

我需要使用一个任务作为无休止的调度;如何在用 asp.net webform 或 .Net Core Web 编写的项目上做到这一点?

该问题仅适用于 Web 项目,例如在控制台项目中它可以正常工作。

4

1 回答 1

2

您不应该使用任务来启动即发即弃的工作,因为没有人可以从中缓存异常。您也将无法从那里使用范围服务(如数据库),因为它会弄乱范围管理。要获得后台运行的过程,您可以使用HostedService

public class MyHostedService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // this starts on app startup in a separate thread
        while (!stoppingToken.IsCancellationRequested)
        {
            // do your stuff
        }
    }
}

// in Startup.ConfigureServices
services.AddHostedService<MyHostedService>();

作为更简单的解决方案,您可以使用第三方 nuget,例如 Hangfire,它处理所有技术样板,并让您立即开始即发即弃的工作hangfireClient.Enqueue(() => { ... })。它还允许设置 cron 类型的计划作业以及许多其他内容。

于 2021-04-13T11:29:35.260 回答