2017-03-17 2 views
1

Ceci est possible en double. Mais, je ne pouvais pas trouver une solution rapide. Sil te plait aide moi.La variable Shared dans la bibliothèque a-t-elle partagé sa valeur dans toutes les applications faisant référence à cette bibliothèque?

J'ai projet de bibliothèque qui a une classe appelée GetData(ByVal contextId as Integer) fonction pour obtenir des données de la base de données et les stocke dans la variable partagée appelée Public Shared _ContextData As String. Et, ce projet de bibliothèque visé par trois applications de fenêtre.

Si toutes mes trois applications Windows s'exécutent simultanément et essayez d'obtenir des données avec contextId différente de la base de données en utilisant la méthode ci-dessus dans cette bibliothèque.

Est-il possible de partager les valeurs contextId d'une application?

J'ai déjà fait référence à des liens ci-dessous. Mais, ils disaient la solution pour l'application web.

Link 1

Link 2

+0

Votre lien 1 se caractérisait * spécifiquement * comme n'étant pas une application Web. –

Répondre

2

Shared est partagée par application et pas toutes applications, j'ai peur. Lorsque vous chargez une DLL, vous la chargez dans la mémoire de l'application, ainsi chaque application a sa propre instance de votre bibliothèque chargée dans la mémoire de l'application (ce qui explique pourquoi Shared ne fonctionne pas avec les applications).

Si vous voulez partager des données entre de nombreuses applications, vous devriez regarder dans Memory Mapped Files.

2

Non, les Shared variables sont liées à la ApplicationDomain (généralement il y en a un par processus). Donc, dans votre cas, vous auriez une variable séparée en mémoire pour chaque processus de vos applications Windows. Si vous exécutez chacune de vos applications Windows, vous en auriez 3, si vous exécutez deux instances de chacune de vos applications Windows, vous auriez 6 variables distinctes.

Si vous souhaitez partager la valeur entre les limites de processus, vous devez vous intéresser aux technologies de communication inter-processus telles que la communication WCF ou Named Pipes. En outre, la création d'un service est une option.

Une option plus simple consiste à stocker la valeur dans une base de données ou dans un fichier auquel chacune des applications accède. Dans l'une ou l'autre de ces options, vous devez réfléchir à la manière de gérer les situations de concurrence lorsque deux applications accèdent à la valeur en même temps.

Si le contextId ne change pas une fois qu'il est sélectionné, une option est d'avoir une application principale et choisissez le contextId dans cette application. Vous démarrez les autres applications à partir de cette application principale (par exemple en utilisant Process.Start) et remettez le contextId en tant qu'argument de ligne de commande. Ces applications "enfant" utilisent le contextId qui leur est donné au démarrage.