Est-il prudent d’utiliser des variables globales C # dans un thread de travail en arrière-plan

Bonjour, je travaille sur une application de bureau simple. Elle doit gérer certaines opérations, telles que le chargement d’une page Web, susceptible de bloquer le thread principal. C’est pourquoi j’ai transféré le code à un travailleur en arrière-plan.

Mon problème est qu’il existe une classe lourde nommée UCSProject, qui contient de nombreux champs chaîne et liste, je dois passer une instance de cette classe au travailleur en arrière-plan, car la classe est un peu lourde, j’aimerais réduire le nombre de doublons. instances en utilisant directement la variable globale au lieu de la transmettre en tant qu’argument à l’agent d’arrière-plan.

Pour faire court, je veux juste savoir s’il est sécuritaire d’accéder aux variables globales à partir d’un thread de travail en arrière-plan en C #.

    Il est sécurisé sauf si vos deux threads (background et normal) ne modifient pas l’object.

    Si vous voulez que votre object soit modifié l’un par l’autre, utilisez Verrouiller.

    Par votre question, je soupçonne que vous ne comprenez pas comment les variables aux classes fonctionnent. Vous n’avez pas besoin d’une variable globale pour n’avoir qu’une seule copie de votre object. Toutes les variables pointeront exactement sur le même object sauf si vous le Clone ou créez-en un nouveau avec l’ancien comme prototype.

    En d’autres termes, une variable globale ne changera rien sauf si vous créez explicitement de nouvelles copies comme décrit dans le paragraphe précédent.

    Je me demande aussi à quel point votre classe peut être lourde si vous pensez que la performance serait pénalisée par la création de copies de celle-ci? Combien de poids cela fait-il?

    Mettre à jour

    Cette série d’articles décrit en détail le tas et la stack: http://www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory01122006130034pm/csharp_memory.aspx

    C’est sûr, mais vous devez synchroniser l’access aux variables, par exemple en utilisant l’instruction lock .

    Voir ” Instruction de locking ” dans la bibliothèque MSDN.

    Non, ce n’est pas le cas, sauf si vous le verrouillez avec un lock(object) { } chaque fois que vous utilisez l’un de ses champs de données.

    Si vous ne modifiez aucune des chaînes ou des variables, vous n’avez pas besoin de verrouiller.

    J’envisagerais également de faire de cette classe une classe statique si les données sont partagées dans l’ensemble de l’application – vous n’aurez alors pas besoin de passer d’instance.

    Si vous avez besoin de modifier ou de mettre à jour les données, utilisez Verrou .

    Vous pouvez également utiliser [ThreadStatic] . La valeur de la variable sera unique pour chaque thread. Voir MSDN pour savoir comment l’utiliser.