2009-07-07 11 views
0

Je cours un fil en C#. J'ai un formulaire Web. J'ai déclaré l'attribut chaîne publique dans mon formulaire Web. (par exemple string myVal) Puis j'ai appelé thread et assigner une valeur à myVal. Il y affecte des valeurs. Mais quand je quitte le code thread, myVal devient nul.comment obtenir la valeur de chaîne à partir du fil

Y at-il de toute façon de garder la valeur myVal.

public string myVal; 

protected void Page_Load(object sender, EventArgs e) 
{ 
System.Threading.Thread myThread = new System.Threading.Thread(this.getVal); 
      myThread.SetApartmentState(System.Threading.ApartmentState.STA); 
      myThread.Start(); 
      myThread.Join(); 

//I am not able to get myVal string over here. 

} 

private void getVal() 
{ 
myVal = "I can easily get myVal over here."; 
} 
+5

Un exemple de code serait bien. – Joseph

+0

@Joseph: le code est fourni maintenant. –

+0

@Syed Tayyab Ali Merci! – Joseph

Répondre

1

échec Cas de test: Je copie-coller votre code dans un nouveau projet ASP.NET et a ajouté, après la myThread.Join():

Label1.Text = myVal; 

Et l'étiquette ne montre votre chaîne.

1

référence ne vous myVal plus loin dans votre code ou êtes-vous simplement inspectez avec le débogueur et vérifier la valeur une fois que vous avez fini avec elle? Si c'est le cas, peut-être que le garbage collector est déjà arrivé.

+0

Oui, j'ai besoin de myVal après le code du thread. –

1

En général, ce que vous semblez faire est d'essayer de conserver une valeur après la sortie du thread sur lequel il a été créé.

Je recommanderais d'utiliser un domaine d'application (MSDN). En bref, tous les threads sont assis dans un AppDomain (pour plus d'informations, visitez le lien) et vous en avez déjà un par la nature du programme.

Alors ce que vous feriez dans votre situation est la suivante:

Pour "sauver" les données: AppDomain.CurrentDomain.SetData("val", myVal);

Pour récupérer les données: AppDomain.CurrentDomain.GetData("val");

Hope qui aide

1

Je suppose vous obtenez "System.InvalidOperationException: opération Cross-thread non valide" dans la méthode getVal. Vous pouvez essayer de l'attraper pour vérifier qu'une exception est levée. Je suggère d'utiliser un BackgroundWorker ou une autre forme de rappel.

+0

J'ai essayé ceci avec un projet WinForms et il semble fonctionner exactement comme Henk Holterman – SwDevMan81

Questions connexes