C#中AutoEvent的使用
·
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 方法。用途:通常用于通知多个等待线程某个条件已经满足,或者需要让多个线程在某个点同时继续执行。
更多推荐




所有评论(0)