2008-09-23 10 views
0

J'ai un processus dans un site Web (Asp.net 3.5 en utilisant pour l'accès aux données Linq à Sql) qui doit fonctionner comme suit:accès au fichier Problème de thread différent dans Asp.net

  1. fichier Télécharger
  2. enregistrer et enregistrer les informations concernant le fichier à la base de données
  3. de données d'importation à partir du fichier dans la base de données
  4. Rediriger vers la page différente

Lors de l'exécution séquentielle comme ça, tout fonctionne bien. Toutefois, étant donné que les fichiers importés peuvent être très volumineux, je voudrais que l'étape 3 s'exécute sur un thread différent du thread de l'interface utilisateur. L'utilisateur doit passer à l'étape 4 alors que l'étape 3 est toujours en cours, et l'écran de l'étape 4 sera mis à jour périodiquement pour informer l'utilisateur lorsque l'importation est terminée.

Je traitais le filetage 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 behind:

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

Quand vous faites cela, je suis en mesure de confirmer par l'intermédiaire débogueur que le nouveau thread démarre correctement . Cependant, chaque fois que je fais cela, le thread s'interrompt en essayant d'accéder au fichier (étape 2 dans le code derrière). Cela fonctionne correctement lors de l'exécution dans le thread principal, donc quelque chose à propos de la situation multi-thread empêche cela. Je pensais que puisque le fichier est sauvegardé sur le disque (ce qui est le cas), il ne devrait pas y avoir de problème avec l'ouverture d'un thread différent. Des idées où je me suis trompé et comment je peux y remédier? Merci!

Remarque: J'utilise un assembly tiers pour ouvrir le fichier. En utilisant le 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 
    } 
} 

Répondre

1

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

+0

Merci! C'est toujours les choses les plus simples ... –

0

L'état d'affichage ASP.NET est une excellente fonctionnalité 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'y a plus besoin 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 sur l'état de la vue. Nous parlerons des moyens de réduire la charge utile inutile et de protéger l'état de vue des regards indiscrets.

Questions connexes