为什么我的 BeginInvoke 运行 同步
Why does my BeginInvoke run synchronously
我已经创建了一个 WCF 应用程序,并且我在多个地方异步使用 BeginInvoke 到 运行 方法。在某些地方它是异步的,而在其他地方它 运行 是同步的。因为系统非常复杂,所以我希望只是抛出这个高级问题,希望有人知道 BeginInvoke 将被强制同步的原因 运行ning.
我考虑并认为不是原因的可能原因:
- 我 运行 没有 ThreadPool 线程 - 我认为在高峰期我使用的线程少于 20 个。
- 我在这些线程之间使用锁定来停止它们的并发执行 - 没有采用同步,因为每次调用都是针对单独的 WCF ServiceHost 上的方法
- 父异步方法(绝对是 运行ning 异步)调用许多子 BeginInvokes 并且您不能嵌套异步调用 - 我认为这不是限制
- 父异步方法本身是 InstanceContextMode.PerSession 的 WCF ServiceHost 的一部分,它在嵌套异步调用方面有一些限制 - 同样,我不这么认为,但仅供参考
- 被调用的每个子项都是一个(与父项不同的)WCF ServiceHost,我调用的方法是相同 ServiceType 的一个实例,并且 运行 与 InstanceContextMode.Single 和 ConcurrencyMode.Single . - 这是否会以某种方式影响 运行 那些异步调用例程(我不明白为什么会这样,但以防万一)
非常感谢ideas/solutions
我想引用 Joe Duffy 在他关于 Windows 的并发编程一书中关于 Delegate.BeginInvoke
的引述:
All delegate types, by convention offer a BeginInvoke and EndInvoke method alongside the ordinary synchronous Invoke method. While this is a nice programming model feature, you should stay away from them wherever possible. The implementation uses remoting infrastructure which imposes a sizable overhead to asynchronous invocation. Queue work to the thread pool directly is often a better approach, though that means you have to co-ordinate the rendezvous logic yourself.
我以前做过自己的测试,如果经常使用这些,开销可能会达到很多秒。也许这不是您问题的答案——因为如果不查看和调试代码,我认为几乎不可能。这更像是一个建议,您应该重新审视您的方法。也许通过直接将工作排队到 ThreadPool,或使用 TPL(Task's / async&await)。
如果您仍然在寻找当前代码的问题而不是修改它以获得更好的策略,并且您仍然需要帮助,您应该找到一种方法来重现您的症状(即 运行同步)并提供证明这一点的代码。
我已经创建了一个 WCF 应用程序,并且我在多个地方异步使用 BeginInvoke 到 运行 方法。在某些地方它是异步的,而在其他地方它 运行 是同步的。因为系统非常复杂,所以我希望只是抛出这个高级问题,希望有人知道 BeginInvoke 将被强制同步的原因 运行ning.
我考虑并认为不是原因的可能原因:
- 我 运行 没有 ThreadPool 线程 - 我认为在高峰期我使用的线程少于 20 个。
- 我在这些线程之间使用锁定来停止它们的并发执行 - 没有采用同步,因为每次调用都是针对单独的 WCF ServiceHost 上的方法
- 父异步方法(绝对是 运行ning 异步)调用许多子 BeginInvokes 并且您不能嵌套异步调用 - 我认为这不是限制
- 父异步方法本身是 InstanceContextMode.PerSession 的 WCF ServiceHost 的一部分,它在嵌套异步调用方面有一些限制 - 同样,我不这么认为,但仅供参考
- 被调用的每个子项都是一个(与父项不同的)WCF ServiceHost,我调用的方法是相同 ServiceType 的一个实例,并且 运行 与 InstanceContextMode.Single 和 ConcurrencyMode.Single . - 这是否会以某种方式影响 运行 那些异步调用例程(我不明白为什么会这样,但以防万一)
非常感谢ideas/solutions
我想引用 Joe Duffy 在他关于 Windows 的并发编程一书中关于 Delegate.BeginInvoke
的引述:
All delegate types, by convention offer a BeginInvoke and EndInvoke method alongside the ordinary synchronous Invoke method. While this is a nice programming model feature, you should stay away from them wherever possible. The implementation uses remoting infrastructure which imposes a sizable overhead to asynchronous invocation. Queue work to the thread pool directly is often a better approach, though that means you have to co-ordinate the rendezvous logic yourself.
我以前做过自己的测试,如果经常使用这些,开销可能会达到很多秒。也许这不是您问题的答案——因为如果不查看和调试代码,我认为几乎不可能。这更像是一个建议,您应该重新审视您的方法。也许通过直接将工作排队到 ThreadPool,或使用 TPL(Task's / async&await)。
如果您仍然在寻找当前代码的问题而不是修改它以获得更好的策略,并且您仍然需要帮助,您应该找到一种方法来重现您的症状(即 运行同步)并提供证明这一点的代码。