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# 在后台轮询其他API并保存数据的类的最佳方法_C#_.net_Dependency Injection_.net Core - Fatal编程技术网

C# 在后台轮询其他API并保存数据的类的最佳方法

C# 在后台轮询其他API并保存数据的类的最佳方法,c#,.net,dependency-injection,.net-core,C#,.net,Dependency Injection,.net Core,因此,我有一个用.NET Core C#编写的网站,我想在后台运行一个进程,对其他网站进行API调用,并将数据保存在数据库中 我已经创建了ApiAccessor类,并希望从控制器调用该方法(它使用依赖项注入进行数据库连接),但是如果我将它们传递给ApiAccessor(它将是异步的),则连接已经被释放。我试着从一开始就注入它,但它仍然会说,在它完成时,接口已经被释放。我只能等待它,但这会导致用户等待太久。我应该采取什么方法来处理这个问题?我是DI的新手。也许去上单身班?我仍然不知道如何将依赖注入

因此,我有一个用.NET Core C#编写的网站,我想在后台运行一个进程,对其他网站进行API调用,并将数据保存在数据库中

我已经创建了ApiAccessor类,并希望从控制器调用该方法(它使用依赖项注入进行数据库连接),但是如果我将它们传递给ApiAccessor(它将是异步的),则连接已经被释放。我试着从一开始就注入它,但它仍然会说,在它完成时,接口已经被释放。我只能等待它,但这会导致用户等待太久。我应该采取什么方法来处理这个问题?我是DI的新手。也许去上单身班?我仍然不知道如何将依赖注入传递给singleton

ApiAccessor:

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,我有,但我如何授予它访问数据库的权限?是的,我有,但我如何授予它访问数据库的权限?