安装了 vs2008后,创建了一个最简单的控制台顺序工作流,执行之后,出现异常:


未处理的异常:  System.InvalidOperationException: 请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly。

   在 System.Diagnostics.PerformanceCounter.Initialize()

   在 System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)

   在 System.Workflow.Runtime.PerformanceCounterManager.CreateCounters(String name)

   在 System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService.OnStarted()

   在 System.Workflow.Runtime.Hosting.WorkflowRuntimeService.HandleStarted(Object source, WorkflowRuntimeEventArgs e)

   在 System.EventHandler`1.Invoke(Object sender, TEventArgs e)

   在 System.Workflow.Runtime.WorkflowRuntime.StartRuntime()

   在 System.Workflow.Runtime.WorkflowRuntime.InternalCreateWorkflow(CreationContext context, Guid instanceId)

   在 System.Workflow.Runtime.WorkflowRuntime.CreateWorkflow(Type workflowType)

   在 ls1.Program.Main(String[] args) 位置 E:\study2008\ls1\ls1\Program.cs:行号25


是因为计数器问题所致,使用 vs2008 的调试功能,发现如下信息

应用准备使用如下参数来创建一个性能计数器

CategoryName Windows Workflow Foundation 3.0.0.0

CounterName Workflows Pending

instanceName _Global_

readOnly  false


发现不是自定义的计数器,要求参数 readOnly 必须为真,实际参数为假,所以系统抛出异常


不过我也没有发现系统在哪里定义了这个计数器,所以也不能将其修改为自定义的计数器,怎么办呀?


经查阅  msdn 后,发现可以关闭计数器,先关闭再说吧。


为我的程序配置一个配置文件

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="CustomWorkflowRuntimeSettings" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

  </configSections>

  <CustomWorkflowRuntimeSettings Name="Workflow1" EnablePerformanceCounters ="false" >

    <!-- Define common parameters and declare services required for your workflow runtime -->

  </CustomWorkflowRuntimeSettings>

</configuration>


配置节 CustomWorkflowRuntimeSettings 说明关闭性能计数器


在程序的创建工作流运行时的时侯,在构造函数中传递这个配置节的名字

WorkflowRuntime workflowRuntime = new WorkflowRuntime("CustomWorkflowRuntimeSettings")

编译时,系统提示需要增加对 System.Configuration 程序集的引用,加入引用,程序终于可以正常工作了。


再次学习 MSDN, 发现使用 PerformanceCounterCategory.Delete(categoryName) 可以删除性能计数器的分类,执行如下代码删除名为 Windows Workflow Foundation 3.0.0.0 的性能计数器,系统正常。


 categoryName = "Windows Workflow Foundation 3.0.0.0";

 PerformanceCounterCategory.Delete(categoryName);


分析:系统中创建的性能计数器分类 Windows Workflow Foundation 3.0.0.0 影响了工作运行时对计数器的使用。

处理:删除此性能计数器分类即可。