Как вызвать функцию по таймеру ASP.NET MVC - PullRequest
16 голосов
/ 02 декабря 2010

Мне нужно вызвать функцию по таймеру (скажем, функцию onTickTack ()) и перезагрузить некоторую информацию в проекте ASP.NET MVC.Я знаю, что есть несколько способов сделать это, но какой из них является лучшим по вашему мнению?

Примечание: функция должна вызываться только из одного места и вызываться каждые X минут до запуска приложения.

РЕДАКТИРОВАТЬ 1: перезагрузить некоторую информацию - например, у меня есть что-то вКэш и я хочу обновить его из БД по таймеру - один раз в день в определенное время.

Ответы [ 4 ]

27 голосов
/ 02 декабря 2010

Ответ на этот вопрос во многом будет зависеть от того, что вы подразумеваете под перезагрузкой некоторой информации в проекте ASP.NET MVC . Это не ясно заявленная проблема, и поэтому более чем очевидно, что у нее не может быть четко сформулированного ответа.

Поэтому, если мы предположим, что этим вы хотите периодически опрашивать некоторые действия контроллера и обновлять информацию о представлении, вы можете использовать функцию javascript setInterval , чтобы периодически опрашивать сервер, отправляя запрос AJAX и обновляя UI:

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
);

Если вы имеете в виду что-то еще, не стесняйтесь предоставить более подробную информацию по вашему вопросу.

12 голосов
/ 02 декабря 2010

Вы можете использовать класс Timer в событии OnApplicationStart Glbal.asax ...

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
}
2 голосов
/ 22 декабря 2016

Мое решение таково:

<script type="text/javascript">
    setInterval(
        function ()
        {
            $.post("@Url.Action("Method", "Home")", {}, function (data) {
                alert(data);
            });
        }, 5000)
</script>

Вызывается метод;

[HttpPost]
public ActionResult Method()
{
  return Json("Tick");
}
1 голос
/ 02 декабря 2010

Я делаю это, запуская рабочий поток из 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();
...