4

私はこの興味深い質問に出会いました:

イベントがあり、2つの長い計算関数がこのイベントにサブスクライブしている場合:

同期して動作しているようです:(メソッド2はメソッド1が終了するまで待機する必要があります

public class A
{
    public event Action f;
    public void Start()
    {
        f();
    }
}
void Main()
{
    A a = new A();
    a.f += Work1;
    a.f += Work2;
    a.Start();
}
public void Work1()
{
    "w1 started".Dump();
    decimal k = 0;
    for(decimal i = 0; i < (99999999); i++)
    {
        k++;
    }
    "w1 ended".Dump();
}
public void Work2()
{
    "w2 started".Dump();
    decimal k = 0;
    for(decimal i = 0; i < 99999999; i++)
    {
        k++;
    }
    "w2 ended".Dump();
}

結果 :

ここに画像の説明を入力してください

質問 :

私見、それは呼び出しリストを持っています、そしてそれがそれが同期的に実行される理由です。

どうすれば実行できますA-synchronouslyか?

4

1 に答える 1

8

イベント自体は常にサブスクライバーを次々に実行します。

しかし、あなたはいつでも例えばあなたのメソッドをTask

void Main()
{
    A a = new A();
    a.f += () => Task.Factory.StartNew(Work1);
    a.f += () => Task.Factory.StartNew(Work2);
    a.Start();
}

または、他の種類のマルチスレッドを使用します。

于 2012-08-15T07:19:25.827 に答える