sto solo usando le nuove funzioni asincrone controller in MVC 4, come descritto qui http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4ASP.NET MVC 4 controller asincrono richiamata
Se ho un'azione che può richiedere 10-20 secondi per eseguire vorrei fornire una sorta di barra di stato per informare l'utente del progresso. Le funzionalità Async hanno qualcosa per aiutare questo fuori?
EDIT: mi prenderò una pugnalata a come cercherò di farlo e vedere se ci sono modi migliori
public async Task<ActionResult> GizmosAsync()
{
return View("Gizmos", await GetGizmosAsync());
}
private void GetGizmosAsync()
{
for(int i=0; i<10; i++)
{
lock(_locker)
{
_statusMessage = String.Format("{0} of 10", i);
}
DoSomethingLongRunning();
}
}
public ActionResult Status()
{
return Json(new { Status = _statusMessage });
}
static readonly object _locker = new object();
static string _statusMessage = "";
....
<script>
setTimeout(displayStatus, 1000);
function displayStatus() {
$.post("/controller/status", function(data) {
alert(data.Status);
});
}
</script>
Sì, ho già fare qualcosa di simile, ma se è lo stesso messaggio per 10 secondi la gente pensa il sistema è bloccato. – Craig
Beh, so che potrebbe non sembrare appropriato, ma a volte l '"illusione" del progresso è proprio ciò di cui gli utenti hanno bisogno. Ad esempio, se sai che il tuo compito richiede in media 15 secondi, automatizza una barra di avanzamento attraverso quella durata usando js. So che può sembrare che stia ingannando l'utente, ma in realtà ci sono alcuni casi in cui in realtà memorizza il progresso parziale da qualche parte, come un database e il tuo polling sul lato client per il progresso esatto è semplicemente eccessivo. –
Non avevo pensato a SignalR, probabilmente avrebbe funzionato bene. – Craig