C# 如何从线程中获取字符串值

C# 如何从线程中获取字符串值,c#,multithreading,string,C#,Multithreading,String,我正在用C#运行一个线程。 我有网络表格。我在web表单中声明了公共字符串属性。(例如字符串myVal) 然后我调用线程并将值赋给myVal。 它在其中赋值。 但当我退出线程代码时,myVal变为null 是否仍有保留myVal值的方法 public string myVal; protected void Page_Load(object sender, EventArgs e) { System.Threading.Thread myThread = new System.Threadin

我正在用C#运行一个线程。 我有网络表格。我在web表单中声明了公共字符串属性。(例如字符串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.";
}

您是在代码中进一步引用myVal,还是只是使用调试器检查它并在使用完之后检查值?如果是这样的话,可能垃圾收集器已经找到了它。

您是在代码中进一步引用myVal,还是只是用调试器检查它,并在处理完之后检查值?如果是这样的话,可能垃圾收集器已经找到了它。

测试用例失败:我将您的代码复制粘贴到一个新的ASP.NET项目中,并在myThread.Join()之后添加:


标签确实显示了您的字符串。

测试用例失败:我将您的代码复制粘贴到一个新的ASP.NET项目中,并在myThread.Join()之后添加:


标签确实显示了您的字符串。

通常,您所做的似乎是在创建它的线程退出后尝试保留一个值

我建议使用应用程序域()。简言之,所有线程都位于AppDomain中(有关更多信息,请访问链接),根据程序的性质,您已经有了一个

因此,在你的情况下,你会做的是:

要“保存”数据:
AppDomain.CurrentDomain.SetData(“val”,myVal)

要检索数据:
AppDomain.CurrentDomain.GetData(“val”)


希望对您有所帮助一般来说,您似乎正在尝试在创建它的线程退出后保留一个值

我建议使用应用程序域()。简言之,所有线程都位于AppDomain中(有关更多信息,请访问链接),根据程序的性质,您已经有了一个

因此,在你的情况下,你会做的是:

要“保存”数据:
AppDomain.CurrentDomain.SetData(“val”,myVal)

要检索数据:
AppDomain.CurrentDomain.GetData(“val”)


希望对您有所帮助

我猜您在getVal方法中得到了“System.InvalidOperationException:跨线程操作无效”。您可以在它周围放置一个try-catch来验证是否抛出了异常。我建议使用回调或其他形式的回调。

我猜您在getVal方法中得到了“System.InvalidOperationException:跨线程操作无效”。您可以在它周围放置一个try-catch来验证是否抛出了异常。我建议使用一个或其他形式的回调。

@Joseph:现在提供了代码。@Syed Tayyab Ali谢谢@约瑟夫:代码已经提供了。@Syed Tayyab Ali谢谢!我在一个WinForms项目中尝试了这一点,它似乎像Henk Holterman saidI在一个WinForms项目中尝试过的那样工作,它似乎像Henk Holterman说的那样工作
Label1.Text = myVal;