冠军

导航

wf工作流 请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly 问题处理

安装了 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 影响了工作运行时对计数器的使用。
处理:删除此性能计数器分类即可。


posted on 2008-03-17 23:32  冠军  阅读(2420)  评论(6编辑  收藏  举报