2012-08-15 155 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