jestem tylko przy użyciu nowych funkcji asynchroniczny kontroler w MVC 4, jak opisano tutaj http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4ASP.NET MVC 4 asynchroniczny kontroler oddzwaniania
Jeśli mam działanie, które może trwać 10-20 sekund, aby uruchomić Chciałbym zapewnić jakiś pasek stanu, aby powiadomić użytkownika o postępie. Czy funkcje Async mają cokolwiek, aby temu zaradzić?
EDIT: wezmę ukłucie w jaki sposób będę próbować zrobić i zobaczyć, czy są jakieś lepsze sposoby
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>
Tak, ja już coś takiego zrobić, ale jeśli jest to ta sama wiadomość przez 10 sekund ludzie uważają system zawiesił. – Craig
Wiem, że to może nie brzmieć właściwie, ale czasami "złudzenie" postępu jest tym, czego potrzebują użytkownicy. Na przykład, jeśli wiesz, że twoje zadanie trwa średnio 15 sekund, zautomatyzuj pasek postępu przez ten czas, używając js. Wiem, że to może wydawać się wygłupiać użytkownika, ale naprawdę są pewne przypadki, w których faktycznie przechowywanie częściowe postępy gdzieś, jak bazy danych i po pollingu stronie klienta dla dokładnego postępu jest po prostu przesada. –
Nie myślałem o SignalR, prawdopodobnie by działało dobrze. – Craig