c#中的回调,调用顺序和返回

时间:2011-05-12 13:46:54

标签: c# callback

关于回调的一个简单问题。完成后,回调函数是否返回到调用函数的下一行?

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

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

所以问题是onA事件会去执行相应的处理程序,然后回到'某些代码2'位,或者这是异步的,代码不会等待事件被完全处理?

我希望问题很明确。

由于 }

5 个答案:

答案 0 :(得分:3)

您使用委托的方式:是同步的。如果需要异步,则必须使用以下命令调用委托:BeginInvoke方法。

答案 1 :(得分:2)

是的,在您的示例中,onA()将触发连接到A的所有事件处理程序以触发。它们只是被调用的方法。在它们全部被调用之后,控制将返回到func()。

它不是异步的 - 您只使用一个线程。一切都将以明确的顺序发生。

一种很好的实验方法是使用内置调试器逐步完成示例中的代码。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

如果希望运行同步代码,您可以使用BeginInvokeThreading

详细了解委托调用here

答案 4 :(得分:0)

正如其他人所指出的那样,这完全是同步的。如果你想异步执行它,你必须以不同的方式写这个。

此外,如果未订阅事件'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...
    }
}

请注意,此代码不会等待完成事件订阅者的执行,您必须通过事件调用来线程化异步结果以确保发生这种情况。

请注意,'callback'是您在异步BeginInvoke中指定的方法(因为它在异步工作完成后被“回调”),并且不会返回到Func(),因为它是在单独执行的线程。