c#中的回调,调用order和return

c#中的回调,调用order和return,c#,callback,C#,Callback,一个关于回调的简单问题。完成后,回调函数是否返回到调用函数中的下一行 class A { public delegate void A(); public event A onA; public void func() { //some code 1 onA(); //some code 2 } 因此,问题是onA事件是否会执行相应的处理程序,然后返回到“somecode2”位,或者这是异步的,代码不会等待事件完全处理 我希望问题是清楚的 谢谢 }您使用委托的方式是

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

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

 public void func()
 {
   //some code 1
  onA();
  //some code 2 
 }
因此,问题是onA事件是否会执行相应的处理程序,然后返回到“somecode2”位,或者这是异步的,代码不会等待事件完全处理

我希望问题是清楚的

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

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

如果will希望运行关联代码,您可以使用
BeginInvoke
Threading

阅读有关委托调用的更多信息。

是的,在您的示例中,onA()将触发连接到to fire的所有事件处理程序。它们只是将被调用的方法。调用完所有函数后,控件将返回func()

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


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

您的代码不同步。但是你可以。

正如其他人所指出的,这是完全同步的。如果您想异步执行此操作,则必须以不同的方式编写此操作

此外,如果未订阅事件“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(),因此:-

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


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

与线程一样,这里也有其他问题,您可能希望在这里执行一些锁定,以避免在Func()执行回调之前跳入回调并结束调用()-ing(这会导致异常)。非常感谢。这正是我所期待的。将按照建议使用调试器对其进行测试。
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...
    }
}