我一直想每10秒调用一次方法,我读到了有关计时器和线程的信息,但问题是我不知道将方法触发的位置,MVC项目有Main吗?
private async Task ActualizarPrecios()
{
Entities model = new Entities();
var transaciones = model.Transacciones.Where(a => a.ESTADO ==
true).ToList();
string Url = ObtenerUrl(model);
ApiForex.IniciarCliente();
ProcesarRequest procesar = new ProcesarRequest();
JObject divisas = await procesar.CargarJson(Url);
foreach(Transacciones item in transaciones)
{
item.PRECIO_ACTUAL = (string)divisas["rates"][item.DIVISA]
["rate"];
}
model.SaveChanges();
}
用于上载数据库中表的某些列的代码。我不知道如何每x秒触发一次此方法
答案 0 :(得分:2)
您可能想研究调度API和第三方工具。 Hangfire(https://www.hangfire.io/)是我成功使用的一种
答案 1 :(得分:0)
我将使用JavaScript实现这一目标。
在View文件(* .cshtml)的底部添加以下代码:
<script type="text/javascript">
var interval = 10000;
setInterval(function() { Update() }, interval);
function Update(){
$.get("/[ControllerName]/ActualizarPrecios", function(){
alert( "Load was performed.")}
);
}
</script>
说明:
<script type="text/javascript">
这是您使用JavaScript语言编写脚本的HTML节点
var interval = 10000;
setInterval(function() { Update() }, interval);
将时间间隔设置为10秒(以毫秒为单位)
然后使用JavaScript函数按一定间隔重复执行,请参见W3 Schools
function Update(){
$.get("/[ControllerName]/ActualizarPrecios", function(){
alert( "Load was performed.")}
);
}
此函数使用Ajax中的jQuery来调用API。哪个存在于您的控制器中。您尚未共享控制器名称,因此请相应地替换代码,该方法对我来说似乎是一种get方法,但是它是
post
,然后将$.get
更改为$.post
。 url路径后的函数在对您的请求的回调中执行。现在,为了使其在测试期间清晰可见,它正在运行第alert( "Load was performed.")
行,这将在浏览器中弹出一个对话框。如果您想在运行请求后将某些内容写到html中,则可以在此处进行操作。
*请注意,jQuery已包含在MVC C#项目中。在\shared\_Layout.cshtml
文件中,您会在页面底部的部分中看到它的引用。
答案 2 :(得分:0)
1)如果您的应用程序要托管在服务器或虚拟机(VM)上,则可以在其上创建窗口服务和注册服务。
2)如果您的应用程序要托管在Azure pass上,则可以使用Azure web作业。 网址:https://docs.microsoft.com/en-us/azure/app-service/webjobs-create