C#中AutoEvent的使用

锁的核心作用之一:当所有方法事件在同时发送,或者顺序颠倒发送时,我们需要按顺序获取数据

AutoResetEvent

行为:当 AutoResetEvent 的 Set 方法被调用时,它将允许一个正在等待的线程继续执行。一旦线程继续执行,AutoResetEvent 的状态将自动重置为未信号状态,阻止其他等待的线程继续执行,直到 Set 方法再次被调用。

用途:通常用于通知单个等待线程某个条件已经满足。

AutoResetEvent

此时通讯、拍照、算法处理等都在同时发送,我们需要先所有相机拍完照片,才能进行下一步算法检测

1.通讯
2.拍照
3.算法处理

算法处理,是和通讯、拍照同步发送的,没法区分顺序。

实际:
while (true)一直在监听执行算法。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {

        // 自动锁,在set之后会解锁
        public static AutoResetEvent camImageEvent1 = new AutoResetEvent(false);
        public static AutoResetEvent camImageEvent2 = new AutoResetEvent(false);
        public static AutoResetEvent commEvent1 = new AutoResetEvent(false);


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Task.Run(WorkFlow);

        }


        public void WorkFlow()
        {
            // 锁的集合
            List<WaitHandle> WaitHandles = new List<WaitHandle>() { camImageEvent1, camImageEvent2, commEvent1 };

            // 循环
            while (true)
            {

                // 限制住了顺序,必须相机12的锁,还有通讯的锁解开之后,才能往下进行算法处理

                // 等待所有的锁解锁之后,才会返回true
                bool bTimeOut = WaitHandle.WaitAll(WaitHandles.ToArray(), 9000);

                // true 取反,false
                // false 取反,就会返回true
                if (!bTimeOut)
                    continue;

                // 进行算法处理
                MessageBox.Show("进行算法处理");
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            MessageBox.Show("通讯");
            // 完成通讯之后,进行解锁
            commEvent1.Set();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("相机1拍照");

            camImageEvent1.Set();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("相机2拍照");

            camImageEvent2.Set();
        }
    }
}

补充:

ManualResetEvent

行为:当 ManualResetEvent 的 Set 方法被调用时,它将允许所有正在等待的线程继续执行。与 AutoResetEvent 不同,ManualResetEvent 的状态在允许一个或多个线程继续执行后不会自动重置。要重置其状态(即阻止更多线程继续执行),必须显式调用 Reset 方法。
用途:通常用于通知多个等待线程某个条件已经满足,或者需要让多个线程在某个点同时继续执行。

更多推荐