我有一个 C# 程序,它有一个“代理”类。该程序创建了几个Agent,每个Agent都有一个“ run() ”方法,它执行一个Task(即:Task.Factory.StartNew() ...)。
每个 Agent 进行一些计算,然后需要等待所有其他 Agent 完成计算,然后才能进入下一个阶段(他的动作将根据其他 Agent 的计算)。
为了让 Agent 等待,我创建了一个 CancellationTokenSource(命名为“tokenSource”),并且为了提醒程序这个 Agent 将要休眠,我抛出了一个事件。因此,两个连续的命令是:
(1) OnWaitingForAgents(new EventArgs());
(2) tokenSource.Token.WaitHandle.WaitOne();
(该事件被“AgentManager”类捕获,该类本身就是一个线程,第二个命令使代理任务线程休眠,直到收到取消令牌的信号)。
每次触发上述事件时,AgentManager 类都会捕获它,并将 +1 加到计数器上。如果计数器的数量等于程序中使用的 Agent 的数量,AgentManager(持有对所有 Agent 的引用)按如下方式唤醒每个 Agent:
agent.TokenSource.Cancel();
现在我们遇到了我的问题:第一个命令由代理异步执行,然后由于线程之间的上下文切换,代理管理器似乎捕获了事件,并继续唤醒所有代理。但是-当前的代理甚至还没有达到第二个命令!因此,代理正在接收“唤醒”信号,然后他才进入睡眠状态,这意味着他被困在没有人唤醒他的情况下!有没有办法将两个连续的方法“原子化”在一起,所以不会发生上下文切换,从而在 AgentManager 有机会唤醒他之前强制 Agent 进入睡眠状态?