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

本文关键字:order return 调用 回调 | 更新日期: 2023-09-27 17:56:08

关于回调的简单问题。回调函数完成后会返回到调用函数中的下一行吗?

class A
{
 public delegate void A();
 public event A onA;
 public void func()
 {
   //some code 1
  onA();
  //some code 2 
 }

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

我希望这个问题是明确的。

谢谢}

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

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

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

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

试验的一个好方法是使用内置调试器单步执行示例中的代码。

你的代码不是异步的。但您可以异步使用委托。

不,调用事件不是异步的事情。代码func()仅在onA()运行结束后才会继续。

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

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

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

此外,如果未订阅事件 '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(),因为它是在单独的线程中执行的。