Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 委托和线程-哪个线程管理调用的方法?_C#_Multithreading_Delegates - Fatal编程技术网

C# 委托和线程-哪个线程管理调用的方法?

C# 委托和线程-哪个线程管理调用的方法?,c#,multithreading,delegates,C#,Multithreading,Delegates,我对学员来说比较陌生,但仍然觉得他们有些困惑。我想要实现它们的方式需要调用从一个线程到另一个线程的委托。哪个线程将执行该方法?我将在这里编写一些示例代码: public delegate void MyDel(); public class main() { Object MyLock = new Object(); public volatile int NumRegistered =

我对学员来说比较陌生,但仍然觉得他们有些困惑。我想要实现它们的方式需要调用从一个线程到另一个线程的委托。哪个线程将执行该方法?我将在这里编写一些示例代码:

    public delegate void MyDel();       

    public class main()
    {   

        Object MyLock = new Object();               
        public volatile int NumRegistered = 0;
        public volatile MyDel Invoker = new MyDel;


        public main()

        {
            Thread t1 = new Thread(new ThreadStart(ThreadA));
            Thread t2 = new Thread(new ThreadStart(ThreadB));

            t1.Start();
            t2.Start();

            while(true)
            {
                if(int == 2)
                {
                    Invoker();
                    int = 1;
                }
            }
        }

        public void ThreadA()
        {
            MyFirstThread tA = new MyFirstThread(this);             
        }

        public void ThreadB()
        {
            MySecondThread tB = new MySecondThread(this);
        }

        public class MyFirstThread
        {           
            public MyFirstThread(main MyParent)
            {
                lock(MyParent.MyLock)
                {
                    MyParent.Invoker += new MyDel(MethodA);
                    MyParent.NumRegistered++;
                }

                while(true)
                {
                    //do something
                }                   
            }

            public void MethodA()
            {
                //This Method A - What thread will run it?  The "Main" thread or "t1"?
            }
        }

        public class MySecondThread
        {

            public MySecondThread(main MyParent)
            {
                lock(MyParent.MyLock)
                {
                    MyParent.Invoker += new MyDel(MethodB);
                    MyParent.NumRegistered++;
                }

                while(true)
                {
                    //do something
                }               
            }

            public void MethodB()
            {
                //This Method B - what thread will run it?  The "Main" thread or "t2"?
            }               
        }
    }

本质上,我只是想学习在不使用backgroundworker类的情况下编写多线程回调“registry”,因为我已经可以使用backgroundworker完成这项工作了,我想了解它。如何让一个线程通知另一个线程它需要做某事?

这样,您的两个新线程将永远不会执行
MethodA
MethodB
因为它们从未调用委托。他们定义了将要执行的方法,他们从来没有实际执行该委托。主线程是唯一真正尝试调用委托的线程,因此它在主线程中运行