2009-08-04 6 views
1

Pour un nouveau projet d'application Web utilisant .NET, une bibliothèque existante (écrite en C#) sera rendue disponible en ligne, ce qui permet de réaliser des calculs sur les informations dans un modèle de données.Puis-je utiliser une bibliothèque non threadsafe dans une application Web .NET multi-utilisateur?

La bibliothèque doit être accessible à plusieurs utilisateurs en même temps. Chaque utilisateur travaillera avec un ensemble de données différent. Les utilisateurs peuvent également modifier les données du modèle et répéter le calcul avec des paramètres d'entrée modifiés.

Actuellement, la bibliothèque ne peut gérer qu'un seul modèle de données à la fois. (Supposons qu'il y a des problèmes de conception comme des classes statiques et des singletons). Si une application Web .NET (une simple interface Web utilisant des pages Web HTML) veut utiliser cette bibliothèque, existe-t-il une technologie permettant de créer une instance distincte de la bibliothèque pour chaque client, pour conserver les modèles et autres paramètres? séparé?

+0

Vos utilisateurs ont besoin de travailler avec des données différentes du modèle en même temps, mais votre bibliothèque ne peut traiter une donnée de modèle à la fois? Ce que vous dites signifie que ce n'est pas possible, y a-t-il seulement des classes statiques dans cette bibliothèque? De quelle bibliothèque parlons-nous? –

+0

Supposons qu'il existe des problèmes de conception tels que des classes statiques ou des singletons qui ne peuvent pas être résolus assez rapidement. – mjn

Répondre

1

Vous pouvez charger le module en externe et créer une nouvelle instance à chaque fois ou utiliser le regroupement d'objets en utilisant .NET Enterprise Services (COM +), mais si l'objet est dynamique, vous aurez toujours des problèmes d'évolutivité. Par commentaire: Oui, vous pouvez. Découvrez this example, pour un démarrage rapide.

+0

Merci beaucoup pour le lien, le regroupement d'objets COM + est une option très intéressante – mjn

+0

Savez-vous si je peux utiliser le pool d'objets COM + dans une application ASP.NET? – mjn

0

Si vous souhaitez que les utilisateurs partagent un objet singleton dans votre instance d'application asp.net, il doit être implémenté avec la sécurité du thread pour tout type d'accès et de modification.

Vous pouvez créer un wrapper pour l'utilisation et la gestion des instances de la bibliothèque.

+0

La bibliothèque dit actuellement 'Traitez mon comme un singleton' mais l'application web aimerait en créer de nombreuses instances avec des états différents. La question de base est de savoir comment créer plusieurs instances de la bibliothèque et lier une session client Web à une instance de bibliothèque. – mjn

0

Vous pouvez utiliser le verrouillage, .: par exemple

lock (typeof(YOUR_MODEL_CLASS)) 
{ 
} 

ou essayer de calculs de file d'attente, enregistrer les paramètres dans un fichier de base de données et un service géré par et faire chaque calcul en son temps.

Il y aura un seuil dans lequel ce sera stable/utilisable.

+0

Chargement du modèle peut prendre une minute, une fois qu'il est terminé, les utilisateurs doivent travailler de manière interactive avec elle. La mise en file d'attente/l'équilibrage de charge est une bonne idée, mais dans ce cas, la commutation entre les demandes des clients et leurs ensembles de données prendrait beaucoup de temps. – mjn

0

La plupart des classes de .NET Framework ne sont pas conçues pour l'accès multi-thread, comme vous pouvez le voir dans le MSDN. Si vous le dites, vos utilisateurs travaillent avec des données de sets différentes, votre programme doit donc créer des instances des classes de la bibliothèque pour chaque utilisateur, ce qui ne me pose aucun problème. Si un grand nombre d'utilisateurs travaillaient sur le même ensemble de données, vous auriez à vous soucier de la capacité de la bibliothèque.

+0

Supposons qu'il existe des problèmes de conception, tels que des classes statiques ou des singletons, qui ne peuvent pas être résolus assez rapidement, de sorte que les instances de modèle de données n'ont pas pu être créées par utilisateur. – mjn

0

Si vous parlez d'un composant qui n'est pas configuré pour être sûr dans un environnement multithread alors la réponse est oui. Cependant, vous devez sélectionner un mécanisme qui synchronise l'accès au composant. La forme la plus simple en C# étant la syntaxe "lock".

Si vous parlez d'un composant qui n'autorise qu'une seule instance à la fois, la réponse est non. C'est parce que les applications Web sont intrinsèquement multithread. L'utiliser dans asp.net vous obligera à verrouiller l'ensemble du serveur pour attendre que le composant se termine ce qui est généralement une mauvaise chose. Ma meilleure solution à cela est de faire de l'utilisation d'un tel composant une opération asynchrone. Autoriser l'utilisateur à spécifier les paramètres d'entrée, puis enregistrer ces données quelque part et utiliser un planificateur de quelque sorte pour traiter les données une à la fois. Lorsque le processus se termine, informez l'utilisateur que le travail est terminé, etc.

De même, lorsque le composant prend beaucoup de temps à traiter, il est préférable de ne pas laisser l'utilisateur interagir avec le composant de façon synchrone.

+0

C'est exactement la réponse dont j'avais peur :) Vous avez raison sur les avantages du traitement asynchrone, mais ce n'est que la première initialisation qui nécessite un certain temps, puis l'interaction avec le modèle de données chargé est rapide. Le problème commence si de nombreux utilisateurs doivent basculer entre les modèles si un seul modèle peut être chargé à la fois pour l'ensemble de l'application Web, provoquant des initialisations tout le temps. La liaison d'une session à une instance de bibliothèque ou l'ajout de fonctionnalités multi-utilisateurs à la bibliothèque sont les options. Savez-vous si je peux utiliser le pool d'objets COM + dans une application ASP.NET? – mjn

+0

Vous pourriez. Mais je ne suis pas sûr que COM + résoudra n'importe quoi à moins que vous puissiez créer un groupe séparé pour chaque modèle parce que c'est le modèle-temps de chargement qui est le vrai problème. Si je me souviens bien, les instances regroupées COM + n'ont aucun état, ce qui peut être impossible à mettre en œuvre. – moin

Questions connexes