C# 在后台轮询其他API并保存数据的类的最佳方法
因此,我有一个用.NET Core C#编写的网站,我想在后台运行一个进程,对其他网站进行API调用,并将数据保存在数据库中 我已经创建了ApiAccessor类,并希望从控制器调用该方法(它使用依赖项注入进行数据库连接),但是如果我将它们传递给ApiAccessor(它将是异步的),则连接已经被释放。我试着从一开始就注入它,但它仍然会说,在它完成时,接口已经被释放。我只能等待它,但这会导致用户等待太久。我应该采取什么方法来处理这个问题?我是DI的新手。也许去上单身班?我仍然不知道如何将依赖注入传递给singleton ApiAccessor:C# 在后台轮询其他API并保存数据的类的最佳方法,c#,.net,dependency-injection,.net-core,C#,.net,Dependency Injection,.net Core,因此,我有一个用.NET Core C#编写的网站,我想在后台运行一个进程,对其他网站进行API调用,并将数据保存在数据库中 我已经创建了ApiAccessor类,并希望从控制器调用该方法(它使用依赖项注入进行数据库连接),但是如果我将它们传递给ApiAccessor(它将是异步的),则连接已经被释放。我试着从一开始就注入它,但它仍然会说,在它完成时,接口已经被释放。我只能等待它,但这会导致用户等待太久。我应该采取什么方法来处理这个问题?我是DI的新手。也许去上单身班?我仍然不知道如何将依赖注入
IUserAccount _userAccounts;
public ApiAccessor(IConfiguration configuration, IUserAccount userAccounts)
{
_configuration = configuration;
_userAccounts = userAccounts;
}
//...
MethodToPollApi(){
var newUserIdToAdd = // just some kind of new data from api
_userAccounts.Add(newUserIdToAdd) // accessing DB, that causes errors
}
控制器:
void Index(){
MethodToPollApi();
return View();
}
我会考虑使用所谓的<代码>后台作业。这类解决方案有几种流行的框架。其中:基于、和的自定义实现可用
我曾经玩过很多,我个人更喜欢自引导,为jobs dashboard提供漂亮的UI,而且非常易于使用-例如,这就是触发jobs light的方式: 立即运行一次:var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));
运行延迟:
BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));
重复运行:
var jobId = RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"), Cron.Daily);
拾取已完成的作业并继续:
BackgroundJob.ContinueWith(jobId, () => Console.WriteLine("Continuation!"));
我会考虑使用所谓的<代码>后台作业。这类解决方案有几种流行的框架。其中:基于、和的自定义实现可用
我曾经玩过很多,我个人更喜欢自引导,为jobs dashboard提供漂亮的UI,而且非常易于使用-例如,这就是触发jobs light的方式: 立即运行一次:var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));
运行延迟:
BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));
重复运行:
var jobId = RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"), Cron.Daily);
拾取已完成的作业并继续:
BackgroundJob.ContinueWith(jobId, () => Console.WriteLine("Continuation!"));
继续回答。使用Hangfire,你可以做类似的事情
services.AddHangfire(x => x.UseSqlServerStorage("<Your connection string>"));
services.AddHangfire(x=>x.UseSqlServerStorage(“”);
希望这能有所帮助。继续回答。使用Hangfire,你可以做类似的事情
services.AddHangfire(x => x.UseSqlServerStorage("<Your connection string>"));
services.AddHangfire(x=>x.UseSqlServerStorage(“”);
希望这有帮助。阅读
IHostedService
界面控制器的目的是对请求提供响应。一旦它做出反应,它的工作就完成了。从控制器方法运行此操作没有意义。如果该索引
被访问100次怎么办?你将有100个进程轮询API。我不认为你需要担心它,它有时间检查等,我只需要执行一段代码轮询API,控制器将控制事件的时间。我只需要控制器传递信息,访问器classRead up将在IHostedService
接口上执行轮询+数据库保存。控制器的目的是提供对请求的响应。一旦它做出反应,它的工作就完成了。从控制器方法运行此操作没有意义。如果该索引
被访问100次怎么办?你将有100个进程轮询API。我不认为你需要担心它,它有时间检查等,我只需要执行一段代码轮询API,控制器将控制事件的时间。我只需要控制器传递信息,访问器classyes,我有,但我如何授予它访问数据库的权限?是的,我有,但我如何授予它访问数据库的权限?