AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

废话不多说,直接上代码:

public class MacAssembly
    {
        public AutoResetEvent mreWaitsupport = new AutoResetEvent(false);
        public AutoResetEvent mreWaitAssembly = new AutoResetEvent(false);
        public AutoResetEvent mreWaitRecheck = new AutoResetEvent(false);
        public void Assembly()
        { 
            Task task1 = new Task(() =>
            {
                while (true)
                {
                    Console.WriteLine("开始组装了...");
                    Thread.Sleep(1000);
                    Console.WriteLine("等待供料....");
                    mreWaitAssembly.WaitOne();
                    for (int i = 0; i < 10; i++)
                    {
                        Thread.Sleep(300);
                        Console.WriteLine("开始组装第..." + i + "颗料...");
                        if (i >= 9)
                        {
                            Console.WriteLine("全部组装OK...");
                            break;
                        }
                    }
                    mreWaitRecheck.Set();
                    Console.WriteLine("通知复检...");
                    break;

                }
            });

            Task task2 = new Task(() =>
            {
                while (true)
                {
                    Console.WriteLine("开始取料了...");
                    Thread.Sleep(1000);
                    Console.WriteLine("上料了....开始组装...");
                    for (int j = 0; j < 10; j++)
                    {
                        Thread.Sleep(300);
                        Console.WriteLine("开始取得第..." + j + "颗料...");
                        if (j >= 9)
                        {
                            Console.WriteLine("全部供料OK...通知可以组装...");
                            mreWaitAssembly.Set();
                            break;
                        }
                    }
                    Console.WriteLine("通知组装...");
                    break;
                }
            });

            Task task3 = new Task(() =>
            {
                while (true)
                {
                    Console.WriteLine("开始复检了...");
                    Thread.Sleep(1000);
                    Console.WriteLine("等待组装完成..开始复检...");
                    mreWaitRecheck.WaitOne();
                    for (int k = 0; k < 10; k++)
                    {
                        Thread.Sleep(300);
                        Console.WriteLine("开始复检第..." + k + "颗料...");
                        if (k >= 9)
                        {
                            Console.WriteLine("全部复检OK...流走...");
                            break;
                        }
                    }
                    Console.WriteLine("通知可以在再取料了...");
                    Console.WriteLine("-----------------------重新开始------------------");
                    
                    break;
                }
                
            });

            task1.Start();
            task2.Start();
            task3.Start();
        }

        public void ReBack()
        {
            
        }
    }

 

 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐