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"位,还是这是异步的,代码不会等待事件被完全处理?
我希望这个问题是明确的。
谢谢}
您使用委托的方式:是同步的。如果需要异步,则必须使用以下命令调用委托:BeginInvoke 方法。
是的,在您的示例中,onA() 将触发所有连接到 A 的事件处理程序以触发。 它们只是将被调用的方法。 在它们全部被调用后,控制权将返回到 func()。
它不是异步的 - 您只使用一个线程。 一切都将按照明确定义的顺序发生。
试验的一个好方法是使用内置调试器单步执行示例中的代码。
你的代码不是异步的。但您可以异步使用委托。
不,调用事件不是异步的事情。代码func()
仅在onA()
运行结束后才会继续。
如果希望运行 assync 代码,您可以使用 BeginInvoke
或Threading
。
在此处阅读有关委托调用的更多信息。
正如其他人所指出的,这完全是同步的。如果你想异步执行它,你必须以不同的方式编写它。
此外,如果未订阅事件 '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(),因为它是在单独的线程中执行的。