0

タイトルが意味をなさない場合は申し訳ありません。

2つのイベントがあります。イベント 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 を調達することです。B のサブスクライバーは、A が動作しているときに自分の仕事を行うことができないためです。

これは私が欲しいものです。

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

これを行う効率的な方法は何ですか?

助けてくれてありがとう!

4

2 に答える 2

0

このようなものはどうですか:

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
于 2013-08-16T16:09:15.267 に答える