Domanda

Sto usando ASP.NET e C # e sto esportando molto grandi risultati esposti in Excel. Mentre il mio codice di esportazione è in esecuzione vorrei mostrare un "loading" gif animate così gli utenti sapranno loro richiesta sta elaborando. Ho cercato di fare questo con il multithreading, ma non sono molto familiarità con essa. Qualcuno mi può guidare nella giusta direzione? Grazie!

Jon

È stato utile?

Soluzione

Stai cercando di fare il multi-threading sul server? Quello che mi raccomando è nel vostro lato client JavaScript accendere un messaggio di attendere prima di inviare al server. Poi sul lato client quando il fatto distacco si accende il messaggio off.

Senza sapere di più sulla tua configurazione attuale non posso fare molto di più, ma l'ultima volta ho implementato questo ho fatto qualcosa in questo senso:

Supponiamo di avere un div chiamato PrintLoadingPanel utilizzando jQuery ho impostato il div per visualizzare e prendere in consegna la finestra:

    $("#printLoadingPanel")
       .css({display:"block",top:"0px",left:"0px",height:screen.availHeight});

Ho poi inizierò un timer con un secondo intervallo di 1/2 che inizierà controllare se abbiamo finito la stampa. Sono solo la generazione e il download di piccole PDF quindi ho bisogno di una risposta più rapida. Se il rapporto è molto lento si potrebbe desiderare di modificare questo:

    window.setTimeout(checkIfDoneDownload,500);

Poi la mia funzione CheckIfDoneDownload colpisce il server e controlla se abbiamo finito di generare il file e scaricato. Sto usando jQuery qui di nuovo per chiamare un AJAX abilitato servizio WCF. Si potrebbe sostituire questo con PageMethods o qualsiasi altro modo di callback al server.

function checkIfDoneDownload()
{

$.ajax({
  type: "POST",
  url: "../Services/Utilities.svc/IsPrintDownloadDone",
  data: "{}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function(msg) {
  if (msg.d)
  {
    $("#printLoadingPanel").css("display","none");
  }
  else  {window.setTimeout(checkIfDoneDownload,500);}
  },  
  error: function (xhr, textStatus, errorThrown) {
  if (xhr.status==12030) {checkIfDoneDownload();}
}
});
}

Ora sul lato server, sto generando i miei download tramite un gestore HTTP. In sostanza la prima cosa che fa è impostato un flag livello di sessione per falso, quindi l'ultima cosa che fa è impostato di nuovo al vero. Il mio check se il servizio fatto proprio restituisce il valore della bandiera.

Altri suggerimenti

Ho eseguito in questo stesso problema con la generazione di rapporti. Una soluzione semplice potrebbe essere quella di eseguire il report di notte e poi scrivere al server. Poi fornire un collegamento al report.

Se siete in grado di utilizzare ASP.NET AJAX, allora mi consiglia di utilizzare il controllo UpdateProgress (insieme ad un UpdatePanel).

Se sei un bella immagine gif animata dopo quindi controllare Ajaxload .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top