Domanda

Ho un processo in un sito Web (Asp.net 3.5 che utilizza Linq-to-Sql per l'accesso ai dati) che deve funzionare come segue:

  1. Carica file
  2. Registra e salva le informazioni relative al file nel database
  3. Importa i dati dal file nel database
  4. Reindirizza a pagina diversa

Quando eseguito in sequenza in questo modo, tutto funziona bene. Tuttavia, poiché i file importati possono essere piuttosto grandi, vorrei eseguire il passaggio 3 su un thread diverso dal thread dell'interfaccia utente. L'utente dovrebbe andare al passaggio 4 mentre il passaggio 3 è ancora in corso e la schermata del passaggio 4 si aggiornerà periodicamente per informare l'utente al termine dell'importazione.

Sto gestendo il threading come segue:

public class Import {

  public static void ImportPendingFile() {
    Import i = new Import();
    Thread newThread = new Thread(new ThreadStart(i.ImportFile));
    newThread.Start();
  }

  public void ImportFile() {
    // 1. Query DB to identify pending file
    // 2. Open up and parse pending file
    // 3. Import all data from file into DB
    // 4. Update db to reflect that import completed successfully
  }
}

E nel codebehind:

protected void butUpload(object sender, EventArgs e) {
  // Save file, prepare for import
  Import.ImportPendingFile();
  Response.Redirect(NewLocation);
}

In questo modo, sono in grado di confermare tramite debugger che il nuovo thread si sta avviando correttamente. Tuttavia, ogni volta che lo faccio, il thread si interrompe quando si tenta di accedere al file (passaggio 2 nel codice dietro). Funziona bene quando eseguito nel thread principale, quindi qualcosa sulla situazione multi-thread lo impedisce. Avevo pensato che dal momento che il file è stato salvato su disco (che è) non ci dovrebbero essere problemi con l'apertura in un thread diverso. Qualche idea su dove ho sbagliato e come posso risolverlo? Grazie!

Nota: sto usando un assembly di terze parti per aprire il file. Usando reflector, ho trovato il seguente codice relativo a come apre il file:

if (File.Exists(fileName)) {
  using (FileStream stream = new FileStream(fileName, FileMode.Open)) {
    // use stream to open file
  }
}
È stato utile?

Soluzione

Prova Response.Redirect (url, false), altrimenti la 'Response' verrà terminata subito dopo quella chiamata.

Altri suggerimenti

Lo stato di visualizzazione ASP.NET è un'ottima funzionalità e uno strumento essenziale per lo sviluppo web di oggi. Mantiene lo stato di una pagina mentre viaggia avanti e indietro. Non è più necessario preoccuparsi di ripristinare i valori dei controlli di pagina tra postback. In questo articolo otterrai una prospettiva approfondita sullo stato di visualizzazione. Parleremo di modi per ridurre il carico utile inutile e proteggere lo stato di visualizzazione da occhi indiscreti.

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