Как вызвать функцию по таймеру ASP.NET MVC
Мне нужно вызвать функцию по таймеру (скажем, функцию onTickTack ()) и перезагрузить некоторую информацию в ASP.NET проект MVC. Я знаю, что есть несколько способов сделать это, но какой из них лучше по вашему мнению?
Примечание: функция должна быть вызвана только из одного места, и должна вызываться каждые x минут, пока приложение.
правка 1: Перезагрузите некоторую информацию - например, у меня есть что - то в кэше, и я хочу обновить его из БД по таймеру-один раз в день время.
4 ответов
ответ на этот вопрос будет очень зависеть от того, что вы подразумеваете под перезагрузите некоторую информацию в ASP.NET проект MVC. Это не четко сформулированная проблема, и как таковая, более чем очевидно, она не может иметь четко сформулированного ответа.
поэтому, если мы предположим, что этим вы хотите периодически опрашивать некоторые действия контроллера и обновлять информацию о представлении, вы можете использовать вход функция javascript для периодического опроса сервера путем отправки AJAX-запрос и обновление пользовательского интерфейса:
window.setInterval(function() {
// Send an AJAX request every 5s to poll for changes and update the UI
// example with jquery:
$.get('/foo', function(result) {
// TODO: use the results returned from your controller action
// to update the UI
});
}, 5000);
Если, с другой стороны, вы имеете в виду выполнение какой-либо задачи на сервере в регулярные периоды, вы можете использовать RegisterWaitForSingleObject способ такой:
var waitHandle = new AutoResetEvent(false);
ThreadPool.RegisterWaitForSingleObject(
waitHandle,
// Method to execute
(state, timeout) =>
{
// TODO: implement the functionality you want to be executed
// on every 5 seconds here
// Important Remark: This method runs on a worker thread drawn
// from the thread pool which is also used to service requests
// so make sure that this method returns as fast as possible or
// you will be jeopardizing worker threads which could be catastrophic
// in a web application. Make sure you don't sleep here and if you were
// to perform some I/O intensive operation make sure you use asynchronous
// API and IO completion ports for increased scalability
},
// optional state object to pass to the method
null,
// Execute the method after 5 seconds
TimeSpan.FromSeconds(5),
// Set this to false to execute it repeatedly every 5 seconds
false
);
Если вы имеете в виду что-то еще, не стесняйтесь предоставлять более подробную информацию по вашему вопросу.
вы можете использовать класс Timer в событии OnApplicationStart Glbal.асакс...
public static System.Timers.Timer timer = new System.Timers.Timer(60000); // This will raise the event every one minute.
.
.
.
timer.Enabled = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
.
.
.
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// Do Your Stuff
}
мое решение таково;
<script type="text/javascript">
setInterval(
function ()
{
$.post("@Url.Action("Method", "Home")", {}, function (data) {
alert(data);
});
}, 5000)
</script>
Называемый Метод;
[HttpPost]
public ActionResult Method()
{
return Json("Tick");
}
Я делаю это, запуская рабочий поток из Application_Start().
вот мой класс:
public interface IWorker
{
void DoWork(object anObject);
}
public enum WorkerState
{
Starting = 0,
Started,
Stopping,
Stopped,
Faulted
}
public class Worker : IWorker
{
public WorkerState State { get; set; }
public virtual void DoWork(object anObject)
{
while (!_shouldStop)
{
// Do some work
Thread.Sleep(5000);
}
// thread is stopping
// Do some final work
}
public void RequestStop()
{
State = WorkerState.Stopping;
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
protected volatile bool _shouldStop;
}
это началось так:
var backgroundThread = new Thread(Worker.DoWork)
{
IsBackground = true,
Name = "MyThread"
};
backgroundThread.Start();