C# 如何将一些信息传递给其他人?

C# 如何将一些信息传递给其他人?,c#,C#,我有两条线。如何从thread1到thread2获取数据。这意味着,当thread1完成它的工作时,它有一些数据,这些数据必须在第二个“thread2”中使用。如何实现 这是代码,但现在该怎么办 static void Main(string[] args) { Thread t1 = new Thread(thread1); t1.Start(); Thread t2 = new Thread(thread

我有两条线。如何从thread1到thread2获取数据。这意味着,当thread1完成它的工作时,它有一些数据,这些数据必须在第二个“thread2”中使用。如何实现

这是代码,但现在该怎么办

static void Main(string[] args)
        {
            Thread t1 = new Thread(thread1);
            t1.Start();
            Thread t2 = new Thread(thread2);
            t2.Start();
        }
        static void thread1()
        {
                string newstring="123";

        }
        static void thread2()
        {
            //what to do here...what code will be here?
            Console.WriteLine(newstring);
        }

在thread1中可以是任意的,但我需要得到这个“任意”,而不是在thread2中使用它,两个线程使用的数据必须在两个线程之间共享

通常称为公共资源

这一点你必须注意,你必须在这里实现

由于两个线程都是独立运行的,并且都在读/写公共数据,因此发生错误的可能性非常高。为了防止这种情况发生,您必须对读/写数据(在公共对象上)实现同步

请参阅下面的代码,其中
CommonResource
在两个线程之间是通用的,并且通过
锁定实现了同步

在您的示例中,一个线程正在写入数据,另一个线程正在读取数据。如果我们不实现同步,那么当线程1正在写入新数据时,线程2(因为它没有等待线程1首先完成它的任务)很可能会带来旧数据(或无效数据)

当有多个线程正在写入数据而不等待其他线程完成写入时,情况会变得最糟糕

public class CommonResourceClass
{
    object lockObj;
    //Note: here main resource is private 
    //(thus not in scope of any thread)
    string commonString;

    //while prop is public where we have lock
    public string CommonResource
    {
        get
        {
            lock (lockObj)
            {
                Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$$$$$$$$$ Reading");
                Thread.Sleep(1000 * 2); 
                return commonString;
            }
        }
        set
        {
            lock (lockObj)
            {
                Console.WriteLine(DateTime.Now.ToString() + " ************* Writing");
                Thread.Sleep(1000 * 5); 
                commonString = value;
            }
        }
    }

    public CommonResourceClass()
    {
        lockObj = new object();
    }
}
而线程调用可能是这样的

    static CommonResourceClass commonResourceClass;
    static void Main(string[] args)
    {
        commonResourceClass = new CommonResourceClass();
        Thread t1 = new Thread(ThreadOneRunner);
        Thread t2 = new Thread(ThreadTwoRunner);
        t1.Start();
        t2.Start();
    }

    static void ThreadOneRunner()
    {
        while(true)
        {
            Console.WriteLine(DateTime.Now.ToString() + " *******Trying To Write");
            commonResourceClass.CommonResource = "Written";
            Console.WriteLine(DateTime.Now.ToString() + " *******Writing Done");
        }
    }

    static void ThreadTwoRunner()
    {
        while(true)
        {
            Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$Trying To Read");
            string Data = commonResourceClass.CommonResource;
            Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$Reading Done");
        }
    }
信息技术的产出:

注意,阅读需要2秒,写作需要5秒,所以阅读应该更快。但如果写作还在继续,阅读必须等到写作完成


您可以在输出中清楚地看到,当一个线程尝试读取或写入时,它无法在另一个线程执行其任务时执行该操作。

有什么建议吗?您的问题实际上与线程无关。由于作用域的原因,即使只有一个线程,该代码也无法工作,即在方法中声明的变量只能在该方法中访问。如果您在类级别声明该变量,那么无论是有多个线程还是只有一个线程,它都会工作。@jmchiliney我真的不知道,怎么做!因此我提出了这样的问题,希望有人能帮助我。处理多线程时的区别在于执行顺序。如果您有一个线程,那么可以通过按顺序调用它们来确保一个方法先于另一个方法执行。如果方法是在不同的线程上执行的,那么不能保证它们每次都会按照您期望的顺序执行,甚至是按照相同的顺序执行。线程同步本身就是一个大话题,所以我们不打算在这里讨论这个问题,“我真的不知道,怎么做”。然后学习。我们不是来教你编程或VB的基础知识的。任何初学者教程都会教你关于变量的知识,所以在尝试使用多线程之前,你应该已经很好地了解了这一点。问题是,你知道怎么做。这不是火箭科学。我说过“在方法中声明的变量只能在该方法中访问”。您知道“in”是什么意思,所以您知道不在方法中声明变量意味着什么。这些词在这里和其他地方的意思相同。别忘了实例化lock对象。如果它使用
静态
字段,这是一个有点糟糕的解决方案。为什么不让它成为非静态的?@Enigmativity我让它们成为静态的,因为没有必要让Resource类成为对象,所有运行的therads的数据都是相同的。这不合适吗?不,不太好。它将整个应用程序限制为只有一个共享实例,并使您依赖于一个类-您不能继承或使用任何形式的多态性。看起来不错。如果你把它做成通用的,那就更好了