在完成事件A之后触发事件B
本文关键字:事件 之后 | 更新日期: 2023-09-27 18:27:55
如果标题没有很好的意义,很抱歉。
我有两项活动。事件A、B和I具有方法M1和M2。M1订阅了事件A。当方法M1启动时,它启动引发事件B的方法M2。
方案如下:
A raised
M1 fired
M2 fired
B raised
----
----
B ended
M2 ended
M1 ended
A ended
我想要的是等到A结束后再筹集B。因为当A工作时,B的订户不能做他们的事情。
这就是我想要的。
A raised
M1 fired
somehow specify to fire M2 right after A finished
M1 ended
A ended
M2 fired
B raised
----
----
B ended
M2 ended
做这件事的有效方法是什么?
谢谢你的帮助!
让M1
启动将运行M2
的新Task
或Thread
。这样M1
将能够完成执行,然后在稍后的时间启动M2
。如果有一个同步机制阻止M2
在M1
完成之前执行任何操作,那么执行顺序将如您所示。
示例:
public class Foo
{
public event Action A;
public event Action B;
public Foo()
{
A += M1;
}
private object key = new object();
private void M1()
{
lock (key)
{
Task.Run(() => M2());
}
}
private void M2()
{
lock (key)
{
if (B != null)
B();
}
}
}
这样的东西怎么样:
public class EventThing
{
public event Action A;
public event Action B;
public EventThing()
{
A += () =>
{
Action next = M1();
if (next != null)
next();
};
}
public void FireA()
{
var AHandlers = A;
if (AHAndlers != null)
{
foreach (Action action in (AHAndlers as MulticastDelegate).GetInvocationList().Reverse())
action();
}
}
private Action M1()
{
Console.WriteLine("Running M1");
return M2;
}
private void M2()
{
Console.WriteLine("Running M2");
if (B != null)
B();
}
}
static void Main(string[] args)
{
var eventThing = new EventThing();
eventThing.A += () => Console.WriteLine("Performing A");
eventThing.B += () => Console.WriteLine("Performing B");
eventThing.FireA();
Console.ReadLine();
}
带输出:
Performing A
Running M1
Running M2
Performing B