Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# .NET核心IHostedService抛出;“一项任务被取消”;立即_C#_.net Core_Asp.net Core Hosted Services - Fatal编程技术网

C# .NET核心IHostedService抛出;“一项任务被取消”;立即

C# .NET核心IHostedService抛出;“一项任务被取消”;立即,c#,.net-core,asp.net-core-hosted-services,C#,.net Core,Asp.net Core Hosted Services,我正试图在我的.NET Core 3.1应用程序中构建一个每小时运行一次的服务。我的服务每小时运行一次(即在StartAsync()中点击一个断点),但实现立即抛出以下错误: 一项任务被取消了 我已经搜索了很多,但是我很难找到有用的答案;似乎在使用HttpClient时最常抛出这些错误,这与我的案例无关 这就是说,我有一种预感,我应该等待一些东西,但我尝试添加wait导致应用程序在启动时挂起(我想我是无意中等待每小时的完整迭代…?)。不在任何地方使用wait;除非有疏忽(很可能),否则我的代码似

我正试图在我的.NET Core 3.1应用程序中构建一个每小时运行一次的服务。我的服务每小时运行一次(即在
StartAsync()
中点击一个断点),但实现立即抛出以下错误:

一项任务被取消了

我已经搜索了很多,但是我很难找到有用的答案;似乎在使用
HttpClient
时最常抛出这些错误,这与我的案例无关

这就是说,我有一种预感,我应该等待一些东西,但我尝试添加
wait
导致应用程序在启动时挂起(我想我是无意中等待每小时的完整迭代…?)。不在任何地方使用
wait
;除非有疏忽(很可能),否则我的代码似乎与所示示例相同

我已经拿出了
ExecuteAll()
的勇气来确认works中的代码

谢谢

公共任务StartSync(CancellationToken CancellationToken)
{
TimeSpan间隔=TimeSpan.FromHours(1);
var nextRunTime=DateTime.Today.AddHours(DateTime.UtcNow.Hour+1);
var curTime=DateTime.UtcNow;
var firstInterval=nextRunTime.Subtract(curTime);
//启动时运行一次
TriggerHourlyService(空);
无效行动()
{
//安排第一次迭代
var t1=任务延迟(第一个间隔);
t1.等待();
TriggerHourlyService(空);
//每小时安排
_定时器=新定时器(
触发小时服务,
无效的
时间跨度0,
间隔
);
}
运行(操作);
返回Task.CompletedTask;
}
private void触发器小时服务(对象状态)
{
使用var scope=_serviceScopeFactory.CreateScope();
IHourlyService hourlyService=scope.ServiceProvider.GetRequiredService();
//异步方法
hourlyService.ExecuteAll();
}
更新 在注释中做了一些注释之后,我重新编写了代码,以远离教程(似乎它在推广一些危险的做法)。然而,通过这次重写,我的应用程序在启动时挂起。我相信这是等待任务。延迟(…)导致了问题,但我的印象是这是非阻塞的

公共异步任务StartAsync(CancellationToken CancellationToken)
{
TimeSpan间隔=TimeSpan.FromHours(1);
var nextRunTime=DateTime.UtcNow.Date.AddHours(DateTime.UtcNow.Hour+1);
var curTime=DateTime.UtcNow;
var firstInterval=nextRunTime.Subtract(curTime);
//启动时运行一次
等待触发小时服务(空);
//下个小时第一次跑步
等待任务。延迟(第一间隔);
等待触发小时服务(空);
//每小时安排
_定时器=新定时器(
异步(状态)=>等待触发小时服务(状态),
无效的
时间跨度0,
间隔
);
}
专用异步任务触发器小时服务(对象状态)
{
使用var scope=_serviceScopeFactory.CreateScope();
IHourlyService hourlyService=scope.ServiceProvider.GetRequiredService();
wait hourlyService.ExecuteAll();
}

如果您想在主机程序启动和停止时运行代码,iHosteService
非常好。您定义的每个服务都将按照您定义的顺序启动和停止。但是,如果start方法从未完成,则主机应用程序将永远不会启动

如果您只需要一个长时间运行的循环,
BackgroundService
将为您提供启动/停止生命周期

公共类MyService:BackgroundService{
受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken){
同时(!stoppingToken.IsCancellationRequested){
等待任务。延迟(..,停止待命);
//
}
}
}

请注意,如果您从不等待未完成的任务,您的服务仍会阻止主机启动。

如果您想在主机程序启动和停止时运行代码,ihostedservice
非常好。您定义的每个服务都将按照您定义的顺序启动和停止。但是,如果start方法从未完成,则主机应用程序将永远不会启动

如果您只需要一个长时间运行的循环,
BackgroundService
将为您提供启动/停止生命周期

公共类MyService:BackgroundService{
受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken){
同时(!stoppingToken.IsCancellationRequested){
等待任务。延迟(..,停止待命);
//
}
}
}

请注意,如果您从不等待未完成的任务,您的服务仍会阻止主机启动。

请告诉我有关您的服务的更多信息。您有一个连接到服务的客户端应用程序。告诉我客户端是如何与服务通信的?你有一个请求和一个响应。答案是,你能详细阐述一下你的建议吗,或者更直接地表达一下你的建议吗?我感觉到有一些隐晦的建议我没有领会。我不想不同意你的意见。你说你没有HttpClient。您有一个与服务器通信的客户端。因此,有一个用于通信的协议。它可以是任何东西,但现在大多数情况下它是HTTP。所以我需要更多关于协议的信息没有阻塞,那么在运行该方法中的任何内容之前,您的服务提供商及其创建的所有内容都将被释放。此外,通过调用:
t1.Wait(),代码可能会陷入死锁。您应该重新构建该块,以便可以正确地等待它。@Santi--
IHostedService
被注入。请告诉我有关您的服务的更多信息。您有一个连接到服务的客户端应用程序。告诉我客户端是如何与服务通信的?你有一个请求和一个响应。回答是:你能不能