2009-07-07 5 views
0

Я запускаю поток в C#. У меня есть веб-форма. Я объявил публичный атрибут строки в своей веб-форме. (например, строка myVal) Затем я вызвал поток и присвоил значение в myVal. Он присваивает в нем значения. Но когда я выхожу из кода потока, myVal становится нулевым.Как получить строковое значение из потока

В любом случае, чтобы сохранить значение 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

Образец кода будет приятным. – Joseph

+0

@Joseph: код предоставляется сейчас. –

+0

@Syed Tayyab Ali Спасибо! – Joseph

ответ

1

отказ Пример теста: Я копировать-вставить код в новый проект ASP.NET и добавил, после myThread.Join():

Label1.Text = myVal; 

И метка действительно показывает вашу строку.

1

ли вы ссылаетесь myVal далее в коде, или вы просто осматривая его с помощью отладчика и проверки значения после того, как вы сделали с ним? Если так, возможно, сборщик мусора уже добрался до него.

+0

Да, мне нужно myVal после кода потока. –

1

Вообще то, что вы, кажется, делаете, пытается сохранить ценность вокруг после того, как поток, который был создан, вышел.

Я бы рекомендовал использовать домен приложения (MSDN). Короче говоря, все потоки размещаются внутри AppDomain (для получения дополнительной информации посетите ссылку), и у вас уже есть один по характеру программы.

Так что вы могли бы сделать в вашей ситуации:

Чтобы "сохранить" данные: AppDomain.CurrentDomain.SetData("val", myVal);

Чтобы получить данные: AppDomain.CurrentDomain.GetData("val");

Надежда, что помогает

1

Моя догадка вы получаете «System.InvalidOperationException: операция поперечного потока недействительна» в методе getVal. Вы можете попытаться поймать его, чтобы убедиться, что выбрано исключение. Я бы предложил использовать BackgroundWorker или другую форму обратного вызова.

+0

Я пробовал это с проектом WinForms, и, похоже, он работает так же, как Хенк Холтерман сказал – SwDevMan81

Смежные вопросы