Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net web窗体和.net核心web项目上无休止地运行任务?_C#_Asp.net_Asp.net Mvc_Asp.net Core_.net Core - Fatal编程技术网

C# 如何在asp.net web窗体和.net核心web项目上无休止地运行任务?

C# 如何在asp.net web窗体和.net核心web项目上无休止地运行任务?,c#,asp.net,asp.net-mvc,asp.net-core,.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,.net Core,当在asp.net webform或.net Core Web中编写的项目上创建线程作为任务并将其添加到服务器时,它会在一段时间后停止运行,而不会出现任何原因或异常 Task.Factory.StartNew(async () => { //... }, _cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current); 我需要使用一个任务作为无休止的调度;如何在用asp.net webform

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

Task.Factory.StartNew(async () =>
{
    //...
}, _cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
我需要使用一个任务作为无休止的调度;如何在用asp.net webform或.net Core Web编写的项目上执行此操作


这个问题只适用于web项目,例如在控制台项目中,它工作正常。

您不应该使用任务启动fire并忘记作业,因为没有人可以缓存来自它的异常。您也将无法从那里使用作用域服务(如DB),因为它会扰乱作用域管理。要使后台进程运行,可以使用
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>();
公共类MyHostedService:BackgroundService
{
受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken)
{
//这将在应用程序启动时在单独的线程中启动
同时(!stoppingToken.IsCancellationRequested)
{
//做你的事
}
}
}
//在Startup.ConfigureServices中
services.AddHostedService();

作为一个更简单的解决方案,您可以使用第三方nuget,比如Hangfire,它处理所有的技术样板文件,让您只需启动fire并立即忘记作业
hangfireClient.Enqueue(()=>{…})
。它还允许设置cron类型的计划作业和许多其他内容。

您不应该使用任务启动fire并忘记作业,因为没有人可以缓存其中的异常。您也将无法从那里使用作用域服务(如DB),因为它会扰乱作用域管理。要使后台进程运行,可以使用
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>();
公共类MyHostedService:BackgroundService
{
受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken)
{
//这将在应用程序启动时在单独的线程中启动
同时(!stoppingToken.IsCancellationRequested)
{
//做你的事
}
}
}
//在Startup.ConfigureServices中
services.AddHostedService();

作为一个更简单的解决方案,您可以使用第三方nuget,比如Hangfire,它处理所有的技术样板文件,让您只需启动fire并立即忘记作业
hangfireClient.Enqueue(()=>{…})
。它还允许设置cron类型的计划作业和许多其他内容。

这是否回答了您的问题?“它会在一段时间后无缘无故地停止运行”-理想情况下,您必须提供更多信息。任务是否有try-catch块?可能是抛出了一个不可捕获的异常(比如invalidAccessException)?这有很多重复的。你不能只是开始一项任务,然后期望它永远运行。所有web服务器都会杀死/重置用于处理请求的对象。web服务器可以按计划或在出现可疑行为时回收应用程序和站点,如耗尽所有CPU或RAM的失控进程。这就是为什么您必须至少使用托管服务这是否回答了您的问题?“它会在一段时间后无缘无故地停止运行”-理想情况下,您必须提供更多信息。任务是否有try-catch块?可能是抛出了一个不可捕获的异常(比如invalidAccessException)?这有很多重复的。你不能只是开始一项任务,然后期望它永远运行。所有web服务器都会杀死/重置用于处理请求的对象。web服务器可以按计划或在出现可疑行为时回收应用程序和站点,如耗尽所有CPU或RAM的失控进程。这就是为什么您必须至少使用托管服务的原因谢谢,旧版本的解决方案是什么?例如asp.net webform?抱歉,从未使用.net,仅使用.net core。对于core,它从2.1开始提供,AFAIK。所以它很旧了。谢谢,旧版本的解决方案是什么?例如asp.net webform?抱歉,从未使用.net,仅使用.net core。对于core,它从2.1开始提供,AFAIK。所以它很老了。