【问题标题】:WF4 Multithreading - Within & Without Visual Studio 2010WF4 多线程 - 包含和不包含 Visual Studio 2010
【发布时间】:2011-02-25 19:47:48
【问题描述】:

我有一个生产者-消费者多线程项目拉动 100 万行并循环遍历每一行。每次迭代都调用workflow-invoker的invoke方法。因为它是一种小调用,也想成为同步调用,所以当我在 Visual Studio 2010 中运行它时,它不使用 CPU 峰值(我预计为 80/90%)但是,只要我在没有 Visual Studio 的情况下运行它,即从控制台运行 exe 文件,它工作正常并达到峰值。 只是为了附加信息,WorkflowInvoker 和 CustomWorkflow 为每个线程实例化,以便它们都可以拥有共享资源的副本。当每次迭代发生时,它会重置输入值,然后调用工作流。

while (true)
{
  row = _buffer.Receive();
  input["arg1"] = arg1;
  input["arg2"] = arg2;
  output = resource.WorkflowInvoker.Invoke(input);
}

我的问题是为什么在 Visual Studio 中运行它时执行没有达到峰值,而不是直接使用 .exe 文件从控制台运行它。

谢谢, 莫伊兹

【问题讨论】:

    标签: multithreading c#-4.0 workflow-foundation-4


    【解决方案1】:

    当您说“在 Visual Studio 中运行”时,您是指在调试器下 (F5),还是刚刚使用 VS (CTRL-F5) 启动?

    如果您在调试器下运行,则性能会有所不同,因为各种事件(包括线程启动/停止和调试跟踪输出)会导致调试器必须处理的调试事件。

    如果您实际上并不想使用调试器,那么 CTRL-F5 往往会提供更快的启动和稍快的执行速度。

    【讨论】:

    • 是的,我的意思是按 F5(使用调试器)。但我想说的是,当我注释掉 WorkflowInvoker.Invoke 语句并在调试器下运行它时,我得到了性能,只要我用调用语句运行它,处理器就会保持在 10/15%。我还注意到,不仅性能受到影响,而且它还在每次迭代的“输出”窗口中写入“(托管(v4.0.30319)):加载'工作流'”语句。
    【解决方案2】:

    我猜想在调试器下运行它会增加开销,以至于任何阻塞都无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2011-04-06
      • 2012-11-02
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多