wf工作流 请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly 问题处理
未处理的异常: 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 影响了工作运行时对计数器的使用。
处理:删除此性能计数器分类即可。