2

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

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

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

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

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

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

谢谢!绍尔

4

2 回答 2

2

DynamicInvoke is definately a synchronous operation. The problem though is that the delegate it points to make not be synchronous. For instance the following code will call Console.WriteLine() in an asynchronous fashion.

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

del1 will be executed synchronously but it will create an asynchronous work item.

I would look for the code the delegate is executing and see if they are doing some asyc magic under the hood.

于 2009-01-06T14:15:29.683 回答
0

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

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

于 2009-01-07T15:41:07.857 回答