Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在另一个类的Main()和thread proc中访问相同的变量? 如果这是C++,我会使用指针。我正在努力学习C语法,对这种语言来说还不够新,我不知道如何解决这个问题_C#_Multithreading - Fatal编程技术网

C# 如何在另一个类的Main()和thread proc中访问相同的变量? 如果这是C++,我会使用指针。我正在努力学习C语法,对这种语言来说还不够新,我不知道如何解决这个问题

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

这个例子在名为ProgramDat的类程序中有一个成员变量,我想从另一个类中的线程访问它。此外,我希望线程能够更改该内存位置,并让Program::Main看到更新,以及让Program::Main更改变量并让线程看到更新

裁判似乎没有这样做。有没有其他构造我可以使用

我认识到这里潜在的种族条件。为了简化这篇文章,我省略了任何同步技术

谢谢

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的更改无法传回。考虑把它封装在一个类中。你真的,真的需要仔细阅读线程,这种代码会严重伤害你。理解同步非常重要。