2009-07-07 21 views
0

私はC#でスレッドを実行しています。 私はウェブフォームを持っています。私は私のWebフォームでpublic string属性を宣言しました。 (例:string myVal) 次にスレッドと呼ばれ、myValに値を割り当てます。 値を割り当てます。 しかし、スレッドコードを終了すると、myValはnullになります。スレッドから文字列値を取得する方法

とにかく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.GetData("val");

希望

1

は私の推測があるのに役立ちます:AppDomain.CurrentDomain.SetData("val", myVal);

は、データを取得するには:

は、データを "保存" するにはgetValメソッドで "System.InvalidOperationException:クロススレッド操作が有効ではありません"が表示されます。例外がスローされていることを確認するためにtry catchを置くことができます。 BackgroundWorkerまたは他の形式のコールバックを使用することをお勧めします。

+0

私はWinFormsプロジェクトでこれを試しましたが、Henk Holtermanのように動作しています – SwDevMan81

関連する問題