C#Workflow ManualWorkflowSchedulerService多线程问题

时间:2010-02-24 16:00:59

标签: c# multithreading workflow

嘿伙计们,我只是想验证我做的是正确的。我们注意到Windows服务有一个非常严重的内存泄漏。我能够跟踪它如何调用Workflow。我重做了一点以阻止内存泄漏,但我想验证代码是否按照我的想法进行操作。注意我不知道关于Workflow的第一件事,所以我来找你。

基本上,代码是在线程上执行Workflow,但是没有将处理程序移除到WorkflowRuntime.Terminated。我正在尝试确保异步执行工作流。以下是代码的相关部分:

检查以确保只有一次WorkflowRuntime实例:

private static void _CheckRuntimeInstance()
{
     lock (_padlock)
     {
          if (_wfRuntime == null)
          {
               _wfRuntime = new WorkflowRuntime();

               ManualWorkflowSchedulerService schedulerService = new ManualWorkflowSchedulerService();
                _wfRuntime.AddService(schedulerService);
                _wfRuntime.StartRuntime();                 
           }
      }
}

在静态方法中,创建要运行的特定WorkflowInstance:

_CheckRuntimeInstance();

// create the instance
WorkflowInstance instance = _wfRuntime.CreateWorkflow(typeof(WorkflowType),parameters);
instance.Start();

Guid instanceId = instance.InstanceId;

ThreadPool.QueueUserWorkItem(CallbackMethod, instanceId);

线程回调方法:

private static void DeviceLocationAssignmentCallback(Object state)
{
     Guid instanceId = (Guid)state;

     EventHandler<WorkflowTerminatedEventArgs> workflowTerminatedHandler = null;
     EventHandler<WorkflowCompletedEventArgs> workflowCompletedHandler = null;

     workflowTerminatedHandler = delegate(object sender, WorkflowTerminatedEventArgs e)
     {
         if (instanceId == e.WorkflowInstance.InstanceId)
         {
             // Remove event registration.
             _wfRuntime.WorkflowTerminated -= workflowTerminatedHandler;
             _wfRuntime.WorkflowCompleted -= workflowCompletedHandler;

             if (e.Exception != null)
             {
                // Log error.
             }
         }
     };

     _wfRuntime.WorkflowTerminated += workflowTerminatedHandler;

     workflowCompletedHandler = delegate(object sender, WorkflowCompletedEventArgs e)
     {
         if (instanceId == e.WorkflowInstance.InstanceId)
         {
             // Remove event registrations.
             _wfRuntime.WorkflowTerminated -= workflowTerminatedHandler;
             _wfRuntime.WorkflowCompleted -= workflowCompletedHandler;
         }
     };

     _wfRuntime.WorkflowCompleted += workflowCompletedHandler;

     _wfRuntime.GetService<ManualWorkflowSchedulerService>().RunWorkflow(instanceId);
}

编辑:更改了帖子的标题以获得更多观看次数。

0 个答案:

没有答案
相关问题