我在C#中运行一个线程。 我有网络表格。我在网络表单中声明了公共字符串属性。 (例如字符串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.";
}
答案 0 :(得分:1)
您是否在代码中进一步引用myVal,或者您只是使用调试器检查它并在完成后检查它?如果是这样,垃圾收集者可能已经接受了它。
答案 1 :(得分:1)
测试用例失败:我将代码复制粘贴到新的ASP.NET项目中,并在myThread.Join()之后添加:
Label1.Text = myVal;
标签确实显示了你的字符串。
答案 2 :(得分:1)
一般来说,你似乎正在做的是尝试在创建它的线程退出后保持一个值。
我建议使用App域(MSDN)。简而言之,所有线程都位于AppDomain中(有关更多信息,请访问该链接),您已经拥有了该程序的性质。
那么你在你的情况下会做的是:
要“保存”数据:AppDomain.CurrentDomain.SetData("val", myVal);
要检索数据:AppDomain.CurrentDomain.GetData("val");
希望有所帮助
答案 3 :(得分:1)
我的猜测是你在getVal方法中得到“System.InvalidOperationException:跨线程操作无效”。你可以试一试它来验证是否抛出异常。我建议使用BackgroundWorker或其他形式的回调。