2009-11-08 4 views
0

J'essaie d'implémenter une barre de progression pour surveiller un téléchargement de fichier. Le fichier est téléchargé dans une iframe et le code C# côté serveur implémente un tampon pour télécharger le fichier en morceaux. Il utilise une boucle while pour cela et les performances de téléchargement semblent convenir à ASP.NET 3.5, et je ne veux vraiment pas utiliser un contrôle tiers ou un schéma de téléchargement complexe. Chaque fois que le traitement passe par la boucle while, il met à jour une variable de session avec le nombre d'octets qu'elle a traité et la taille totale du fichier. Du côté client, le bouton qui implémente le formulaire de téléchargement iframe submit lance également un setInterval Javascript (...) pour une fonction qui utilise XMLHttpRequest sur une autre page asp.net dont la seule fonction est de lire ces variables de session et Réponse.Écrivez-les. Ceux-ci devraient être retournés à la fonction de rappel et utilisés pour mettre à jour la barre de progression.Variables de session ASP.NET - Écrit par téléchargement de fichier - Lire par XMLHttpRequest à une autre page

Conceptuellement, cela fonctionne et le flux est possible. Je sais cela en mettant un point d'arrêt dans mon gestionnaire de téléchargement pour arrêter le téléchargement et mettre un autre point d'arrêt dans la page 'ping'. Je peux aller et venir dans le débogueur et regarder les variables de session étant définies et lues.

Malheureusement, cela ne fonctionne pas vraiment en réalité sans les points d'arrêt. La page ping sortira et ne reviendra pas. Cela se produit jusqu'à ce que le téléchargement est terminé, à quel point il sera heureusement travailler pour obtenir un des résultats finaux. Comme il s'agit de deux requêtes de pages distinctes, je suppose que ce que j'ai sont deux threads distincts, essayant tous les deux d'utiliser la même variable de session. Comme ceux-ci sont générés par IIS, je n'ai aucun handle pour ces threads. Le processus de téléchargement utilise probablement les variables de session tellement que la page ping ne peut pas l'obtenir. En outre, j'ai eu le système verrouiller à la fois le navigateur et IIS. J'ai essayé de lire sur la synchonisation de thread, mais je ne comprends pas assez bien pour l'implémenter entre threads pour lesquels je n'ai pas de poignées.

Quelqu'un aurait-il l'amabilité de me montrer du code C# sur la façon de procéder? Je peux trouver un exemple de code, mais ils créent tous les deux threads et ont donc les poignées. Je peux obtenir le fil actuel dans l'une ou l'autre des pages, mais les pages n'ont pas accès aux threads de l'autre.

Merci pour vous!

Répondre