C# 如何在另一个类的Main()和thread proc中访问相同的变量? 如果这是C++,我会使用指针。我正在努力学习C语法,对这种语言来说还不够新,我不知道如何解决这个问题
这个例子在名为ProgramDat的类程序中有一个成员变量,我想从另一个类中的线程访问它。此外,我希望线程能够更改该内存位置,并让Program::Main看到更新,以及让Program::Main更改变量并让线程看到更新 裁判似乎没有这样做。有没有其他构造我可以使用 我认识到这里潜在的种族条件。为了简化这篇文章,我省略了任何同步技术 谢谢C# 如何在另一个类的Main()和thread proc中访问相同的变量? 如果这是C++,我会使用指针。我正在努力学习C语法,对这种语言来说还不够新,我不知道如何解决这个问题,c#,multithreading,C#,Multithreading,这个例子在名为ProgramDat的类程序中有一个成员变量,我想从另一个类中的线程访问它。此外,我希望线程能够更改该内存位置,并让Program::Main看到更新,以及让Program::Main更改变量并让线程看到更新 裁判似乎没有这样做。有没有其他构造我可以使用 我认识到这里潜在的种族条件。为了简化这篇文章,我省略了任何同步技术 谢谢 using System; using System.Threading; public class Program { static Manua
using System;
using System.Threading;
public class Program
{
static ManualResetEvent ExitEvent;
static MyThread t;
static int ProgramDat;
public static void Main()
{
ExitEvent = new ManualResetEvent(false);
ProgramDat = 12; // initialize to some value
t = new MyThread(ExitEvent, ref ProgramDat);
Thread.Sleep(1500); // let MyThread run a bit
// Main() doesn't see the changes MyThread::RunLoop() made
Console.WriteLine("Main just before setting to 500, MyFormDat={0}", ProgramDat);
ProgramDat = 500; // and this change is not seen in MyThread::RunLoop();
Console.WriteLine("Main just set MyFormDat={0}", ProgramDat);
Thread.Sleep(2000);
Console.WriteLine("Just prior to telling thread to exit, MyFormDat={0}", ProgramDat);
ExitEvent.Set();
Thread.Sleep(500); // wait to let MyThread::RunLoop() finish
Console.WriteLine("main leaving. MyFormDat={0}", ProgramDat);
}
}
public class MyThread
{
ManualResetEvent e;
Thread t;
int MyThreadDat;
public MyThread(ManualResetEvent ev, ref int FromProgramDat)
{
e = ev;
MyThreadDat = FromProgramDat;
t = new Thread(RunLoop);
t.Start();
}
public void RunLoop()
{
while (true)
{
if (e.WaitOne(300) == true)
{
Console.WriteLine("RunLoop leaving!");
return;
}
else
{
Console.WriteLine("tic. iFormDat={0}", MyThreadDat);
MyThreadDat++; // change it each loop but I can't get Main() to see this change
}
}
}
}
NET中的大多数类型都是具有引用语义的引用类型,就像C/C++中的指针一样。主要的例外是值类型:枚举和结构 但在这种情况下,只需将ProgramDat设置为internal,其他类型(如Program.ProgramDat)可以访问它,只要其他类型位于同一程序集中 如果您有重要的状态要共享,并且除非它是不可变的,否则这是一种反模式,请将其包装在引用类型中,在Main中实例化并将引用传递到线程中 注意。ref modify将参数从通过值更改为通过引用;这允许被调用函数更改被调用函数中变量的值
void PassByRef(ref int x) {
x = 42;
}
void PassByValue(int x) {
// This has no effect
x = 84;
}
var Caller() {
x = 1;
Console.WriteLine(x); // Writes 1
PassByRef(ref x);
Console.WriteLine(x); // Writes 42
PassByValue(x);
Console.WriteLine(x); // Writes 42: no change by PassByValue
}
main是一个静态变量,变量必须相同。在程序类make say ProgramDat public或internal中,在MyThread中使用MyThreadDat=Program.ProgramDatint是一种值类型,赋值总是生成值的副本。因此,对MyThreadDat的更改无法传回。考虑把它封装在一个类中。你真的,真的需要仔细阅读线程,这种代码会严重伤害你。理解同步非常重要。