c#中的回调,调用订单并返回
一个简单的回调问题。完成后,回调函数是否会返回调用函数中的下一行?c#中的回调,调用订单并返回
class A
{
public delegate void A();
public event A onA;
public void func()
{
//some code 1
onA();
//some code 2
}
所以现在的问题是将ONA事件去执行相应的处理程序,然后回来“一些代码2”位或这是异步代码不会等待事件被完全处理?
我希望问题很清楚。
感谢 }
是的,在你的例子中,onA()会触发所有事件处理程序连接到A来触发。他们只是将被调用的方法。他们都被调用后,控制权将返回到func()。
它不是异步的 - 你只使用一个线程。一切都将按照明确的顺序进行。
一个很好的实验方法是使用内置的调试器遍历示例中的代码。
您使用委托的方式:是同步的。如果你想异步,你必须使用:BeginInvoke方法调用委托。
不,调用一个事件不是一个assync的东西。您的代码func()
只会在onA()
结束运行后继续。
如果您想要运行assync代码,您可以使用BeginInvoke
或Threading
。
阅读更多关于委托调用here。
正如其他人所指出的,这完全是同步的。如果你想异步执行这个,你必须以不同的方式写这个。此外,如果事件'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(),因为它在单独的线程。
这里还有其他一些问题,像线程一样,你可能想在这里做一些锁定以避免回调跳入和EndInvoke() - 在Func()执行之前(这会导致异常)。 – ljs 2011-05-12 14:38:59
非常感谢。这就是我期待的。将按照您的建议使用调试器进行测试。 – user642770 2011-05-12 15:50:24