关于回调的一个简单问题。完成后,回调函数是否返回到调用函数的下一行?
class A
{
public delegate void A();
public event A onA;
public void func()
{
//some code 1
onA();
//some code 2
}
所以问题是onA事件会去执行相应的处理程序,然后回到'某些代码2'位,或者这是异步的,代码不会等待事件被完全处理?
我希望问题很明确。
由于 }
答案 0 :(得分:3)
您使用委托的方式:是同步的。如果需要异步,则必须使用以下命令调用委托:BeginInvoke方法。
答案 1 :(得分:2)
是的,在您的示例中,onA()将触发连接到A的所有事件处理程序以触发。它们只是被调用的方法。在它们全部被调用之后,控制将返回到func()。
它不是异步的 - 您只使用一个线程。一切都将以明确的顺序发生。
一种很好的实验方法是使用内置调试器逐步完成示例中的代码。
答案 2 :(得分:2)
您的代码不是assync。但你可以Use Delegates Asynchronously。
答案 3 :(得分:1)
答案 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(),因为它是在单独执行的线程。