【发布时间】:2020-06-03 20:16:19
【问题描述】:
我正在开发一个用 C# 编写并托管在使用 IIS 10 作为 Web 服务器的 Azure 虚拟机中的 ASP.NET Web 应用程序。我必须安排一个后台任务每天运行一次。为此,我创建了以下DailyTask 类:
public class DailyTask : IHostedService {
public Task StartAsync(CancellationToken cancellationToken) {
Debug.WriteLine("start");
Task.Run(TaskRoutine, cancellationToken);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) {
Debug.WriteLine("stop");
return null;
}
public Task TaskRoutine() {
while (true) {
try {
/* ... */
DateTime nextStop = DateTime.Now.AddDays(1);
var timeToWait = nextStop - DateTime.Now;
var millisToWait = timeToWait.TotalMilliseconds;
Thread.Sleep((int)millisToWait);
}
catch (Exception e) {
Debug.WriteLine(e);
}
}
}
}
为了开始这项任务,我在 Startup 类中添加了以下语句:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
/* ... */
services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, HiddenUserCleaner>();
/* ... */
}
}
在我的测试服务器上部署后,我观察到此解决方案运行良好。但它可靠吗?如果在生产中使用会不会有问题?
【问题讨论】:
-
您尝试做的事情类似于使用像 Hangfire 这样的框架,所以它遇到了同样的问题,您应该返回并检查替代方案。我在blog.lextudio.com/unpleasant-facts-about-hangfire-632a3228ff8a分享了一些提示
标签: c# asp.net iis scheduled-tasks