2012-08-15 57 views
4

我遇到了这个有趣的问题:运行.net事件异步?

如果我有一个事件,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(); 
} 

结果:

enter image description here

问:

恕我直言,它有一个调用列表和THAT'S就是为什么它同步运行的原因。

我该如何让它运行A-synchronously

回答

8

事件本身会一直运行它的订户。

但你总是可以用你的方法包装Task

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

或者使用其他类型的多线程。

+0

请注意:您需要'4.0' ... – Tigran 2012-08-15 07:24:51

+2

@Tigran是的,但您也可以使用'BackgroundWorker','Thread'或异步委托调用'BeginInvoke'等。 – sloth 2012-08-15 07:28:59