远程对象上的DynamicInvoke是否异步工作?

时间:2009-01-06 13:47:38

标签: c# vb.net multithreading delegates remoting

我继承了一些主要的意大利面条代码(C#/ VB组合),我想在这里理解。

这似乎是一个非常奇怪的情况,其中有两个连续调用触发事件到远程对象,这是通过调用委托的DynamicInvoke方法完成的,格式为:

delegate1.DynamicInvoke(args1);
// some code here
delegate2.DynamicInvoke(args2);

delegate1和delegate2都引用同一个远程“订户”对象中的方法。

根据我在documentation中可以阅读的所有内容,DynamicInvoke看起来应该是同步的。但是在我看来,当我将断点放入远程进程时,我可以看到,delegate1和delegate2引用的方法在不同的线程中同时运行

这是另一个微软“未记录的功能”吗?我应该预料到这一点吗?关于为什么会这样做的任何解释?如果它意味着异步运行,那么DynamicInvoke如何具有返回值?

谢谢! 沙乌尔

2 个答案:

答案 0 :(得分:2)

DynamicInvoke绝对是一个同步操作。但问题是它指向的委托不是同步的。例如,以下代码将以异步方式调用Console.WriteLine()。

Action write = () => Console.WriteLine("foo");
Action del1 = () => { ThreadPool.QueueUserWorkItem(write); }
...
del1.DynamicInvoke();

del1将同步执行,但它将创建一个异步工作项。

我会查找委托正在执行的代码,看看他们是否在幕后做了一些asyc魔术。

答案 1 :(得分:0)

我的主要建议是在两个过程中仔细检查调用堆栈。

您的“spaghetti”代码是否可能实际上有回调。 你的第一个委托调用你的远程进程,它回调,你的第二个委托是从嵌套的回调中调用的吗?