Frage Wie Funktion auf Timer ASP.NET MVC aufgerufen wird


Ich muss Funktion auf Timer aufrufen (sagen wir OnTickTack () -Funktion) und einige Informationen in ASP.NET MVC-Projekt neu laden. Ich weiß, dass es verschiedene Möglichkeiten gibt, aber welche ist Ihrer Meinung nach die beste?

Hinweis: Die Funktion sollte nur von einem Ort aus aufgerufen werden und sollte alle X Minuten aufgerufen werden, bis die Anwendung aktiv ist.

EDIT 1: Reload einige Informationen - zum Beispiel habe ich etwas im Cache und ich möchte es von DB auf Timer aktualisieren - einmal pro Tag in einer bestimmten Zeit.


11
2017-12-01 22:36


Ursprung


Antworten:


Die Antwort auf diese Frage hängt sehr davon ab, was Sie meinen Laden Sie einige Informationen in ASP.NET MVC-Projekt neu. Dies ist kein klar definiertes Problem, und als solches kann es mehr als offensichtlich keine klar ausgesprochene Antwort haben.

Wenn Sie also davon ausgehen, dass Sie regelmäßig einige Controlleraktionen abfragen und Informationen in einer Ansicht aktualisieren möchten, können Sie das verwenden setInterval JavaScript-Funktion, um den Server regelmäßig abzufragen, indem eine AJAX-Anfrage gesendet und die Benutzeroberfläche aktualisiert wird:

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

Wenn Sie auf der anderen Seite meinen, eine Aufgabe auf dem Server zu bestimmten Zeiten auszuführen, könnten Sie die RegisterWaitForSingleObject Methode wie folgt:

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

Wenn Sie etwas anderes meinen, zögern Sie nicht, weitere Details zu Ihrer Frage anzugeben.


24
2017-12-01 22:43



Sie können die Timer-Klasse in OnApplicationStart Event of Glbal.asax verwenden ...

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
}

11
2017-12-01 22:43



Meine Lösung ist so;

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

Genannte Methode;

[HttpPost]
public ActionResult Method()
{
  return Json("Tick");
}

2
2017-12-22 06:51



Ich tue dies, indem ich einen Arbeitsthread von Application_Start () starte.

Hier ist meine Klasse:

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

Es hat so angefangen:

        var backgroundThread = new Thread(Worker.DoWork)
                                  {
                                      IsBackground = true,
                                      Name = "MyThread"
                                  };
        backgroundThread.Start();

1
2017-12-01 22:42