在完成事件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

做这件事的有效方法是什么?

谢谢你的帮助!

在完成事件A之后触发事件B

M1启动将运行M2的新TaskThread。这样M1将能够完成执行,然后在稍后的时间启动M2。如果有一个同步机制阻止M2M1完成之前执行任何操作,那么执行顺序将如您所示。

示例:

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