正如其他人所指出的,這完全是同步的。如果你想異步執行這個,你必須以不同的方式寫這個。此外,如果事件'onA'未訂閱,onA()將引發空引用異常。
通常的模式是定義事件發生時調用的事件'Foo'和方法'OnFoo'。從我懷疑這個事件的名字是你的願望 - 例如: -
class Foo // Class and member names must be distinct
{
public delegate void ADelegate();
public event ADelegate A;
private void OnA()
{
if(A != null)
A();
}
public void Func()
{
// Some code...
OnA();
// More code...
}
}
如果你想打電話預訂的事件處理程序異步,你可以使用的BeginInvoke()和EndInvoke(),因此: -
class Foo // Class and member names must be distinct
{
public delegate void ADelegate();
public event ADelegate A;
private void OnA()
{
if (A == null) return;
// There may be multiple subscribers, invoke each separately.
foreach(ADelegate del in A.GetInvocationList())
del.BeginInvoke(SubscriberCallback, del);
}
private void SubscriberCallback(IAsyncResult result)
{
var del = (ADelegate) result.AsyncState;
del.EndInvoke(result);
// Do something in the callback...
}
public void Func()
{
// Some code...
OnA();
// More code...
}
}
請注意,此代碼將不會等待完成執行事件訂戶,您將不得不通過事件調用線程異步結果,以確保發生這種情況。
請注意,「回調」是您在異步BeginInvoke中指定的方法(因爲它在異步工作完成後被「回調」),並且不會返回到Func(),因爲它在單獨的線程。
來源
2011-05-12 14:37:13
ljs
非常感謝。這就是我期待的。將按照您的建議使用調試器進行測試。 – user642770 2011-05-12 15:50:24