2009-07-07 14 views
0

Ich führe einen Thread in C#. Ich habe Webformular. Ich habe das öffentliche String-Attribut in meinem Web-Formular deklariert. (z. B. String myVal) Dann habe ich Thread und myVal Wert zuweisen. Er weist Werte darin zu. Aber wenn ich den Thread-Code verlasse, wird myVal null.Wie bekomme ich String-Wert von Thread

Gibt es sowieso, myVal Wert zu halten.

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

Ein Codebeispiel wäre nett. – Joseph

+0

@Joseph: Code wird jetzt bereitgestellt. –

+0

@Syed Tayyab Ali Danke! – Joseph

Antwort

1

Test Case failure: Ich kopiere kleistert Ihren Code in einem neuen ASP.NET-Projekt und fügte hinzu, nach dem myThread.Join():

Label1.Text = myVal; 

Und das Etikett Zeichenfolge tut zeigen.

1

Haben Sie Mýval weiter in Ihrem Code verweisen oder inspizieren Sie es einfach mit dem Debugger und die Überprüfung der Wert, nachdem Sie mit ihm fertig sind? Wenn ja, ist der Müllsammler schon dran.

+0

Ja, ich brauche myVal nach dem Thread-Code. –

1

Im Allgemeinen versuchen Sie anscheinend, einen Wert beizubehalten, nachdem der Thread, auf dem er erstellt wurde, beendet wurde.

Ich würde empfehlen, eine App Domain (MSDN) zu verwenden. Kurz gesagt, alle Threads sitzen in einer AppDomain (für weitere Informationen besuchen Sie den Link) und Sie haben bereits eine durch die Art des Programms.

Also, was Sie in Ihrer Situation tun würde, ist:

Um die Daten zu "retten": AppDomain.CurrentDomain.SetData("val", myVal);

die Daten abzurufen: AppDomain.CurrentDomain.GetData("val");

Hoffnung, die

1

Meine Vermutung hilft, ist Sie erhalten "System.InvalidOperationException: Cross-Thread-Operation nicht gültig" in der GetVal-Methode. Sie können versuchen, es zu fangen, um sicherzustellen, dass eine Ausnahme ausgelöst wird. Ich würde vorschlagen, eine BackgroundWorker oder eine andere Form des Rückrufs zu verwenden.

+0

Ich habe dies mit einem WinForms-Projekt versucht und es scheint zu funktionieren, genau wie Henk Holterman sagte – SwDevMan81

Verwandte Themen