Question

J'ai un processus sur un site Web (Asp.net 3.5 utilisant Linq-to-Sql pour l'accès aux données) qui doit fonctionner comme suit:

  1. Télécharger le fichier
  2. Enregistrez et enregistrez les informations concernant le fichier dans la base de données
  3. Importer des données d'un fichier dans la base de données
  4. redirection vers une autre page

Lorsqu'il est exécuté séquentiellement de la sorte, tout fonctionne correctement. Cependant, étant donné que les fichiers importés peuvent être volumineux, j'aimerais que l'étape 3 soit exécutée sur un autre thread que celui de l'interface utilisateur. L'utilisateur doit accéder à l'étape 4 pendant que l'étape 3 est en cours et l'écran de l'étape 4 sera régulièrement mis à jour pour l'informer de la fin de l'importation.

Je gère les threads comme suit:

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

Et dans le codebhind:

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

Ce faisant, je suis en mesure de confirmer via le débogueur que le nouveau thread démarre correctement. Cependant, chaque fois que je le fais, le thread s'interrompt lors de la tentative d'accès au fichier (étape 2 du code suivant). Cela fonctionne bien lorsqu'il est exécuté dans le thread principal, ce qui empêche quelque chose au sujet de la situation multi-thread. J'avais pensé que depuis que le fichier est sauvegardé sur disque (ce qui est le cas), il ne devrait pas y avoir de problème pour l'ouvrir dans un autre thread. Des idées où j'ai mal tourné et comment je peux y remédier? Merci!

Remarque: j'utilise un assemblage tiers pour ouvrir le fichier. À l’aide de réflecteur, j’ai trouvé le code suivant lié à la façon dont il ouvre le fichier:

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

La solution

Essayez Response.Redirect (url, false), sinon la "Réponse" sera terminée juste après cet appel.

Autres conseils

L'état d'affichage ASP.NET est une fonctionnalité intéressante et un outil essentiel pour le développement Web d'aujourd'hui. Il maintient l'état d'une page lors de ses déplacements. Il n'est plus nécessaire de s'inquiéter de la restauration des valeurs des contrôles de page entre les publications. Dans cet article, vous obtiendrez une perspective détaillée de l'état d'affichage. Nous parlerons des moyens de réduire la charge utile inutile et de protéger l’état de vue des regards indiscrets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top