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...
}
}