c#中的回调,调用订单并返回

问题描述:

一个简单的回调问题。完成后,回调函数是否会返回调用函数中的下一行?c#中的回调,调用订单并返回

class A 
{ 
public delegate void A(); 
public event A onA; 

public void func() 
{ 
    //some code 1 
    onA(); 
    //some code 2 
} 

所以现在的问题是将ONA事件去执行相应的处理程序,然后回来“一些代码2”位或这是异步代码不会等待事件被完全处理?

我希望问题很清楚。

感谢 }

是的,在你的例子中,onA()会触发所有事件处理程序连接到A来触发。他们只是将被调用的方法。他们都被调用后,控制权将返回到func()。

它不是异步的 - 你只使用一个线程。一切都将按照明确的顺序进行。

一个很好的实验方法是使用内置的调试器遍历示例中的代码。

+0

非常感谢。这就是我期待的。将按照您的建议使用调试器进行测试。 – user642770 2011-05-12 15:50:24

您使用委托的方式:是同步的。如果你想异步,你必须使用:BeginInvoke方法调用委托。

不,调用一个事件不是一个assync的东西。您的代码func()只会在onA()结束运行后继续。

如果您想要运行assync代码,您可以使用BeginInvokeThreading

阅读更多关于委托调用here

你的代码不是assync。但你可以Use Delegates Asynchronously

正如其他人所指出的,这完全是同步的。如果你想异步执行这个,你必须以不同的方式写这个。此外,如果事件'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(),因为它在单独的线程。

+0

这里还有其他一些问题,像线程一样,你可能想在这里做一些锁定以避免回调跳入和EndInvoke() - 在Func()执行之前(这会导致异常)。 – ljs 2011-05-12 14:38:59