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
- fichier Télécharger
- enregistrer et enregistrer les informations concernant le fichier à la base de données
- de données d'importation à partir du fichier dans la base de données
- 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
}
}
Merci! C'est toujours les choses les plus simples ... –