C # Workflow ManualWorkflowSchedulerService Вопрос многопоточности - PullRequest
1 голос
/ 24 февраля 2010

Эй, ребята, я просто хотел убедиться, что я делаю правильно. До нашего сведения дошло, что у службы Windows была довольно серьезная утечка памяти. Я смог отследить его до того, как назывался Workflow. Я немного переработал его, чтобы остановить утечку памяти, но я хотел проверить, что код делает то, что я думаю. Заметьте, я не знаю ничего о Workflow, поэтому я иду к вам.

По сути, код выполнял рабочий процесс в потоке, но не удалял обработчик для WorkflowRuntime.Termination. Я пытаюсь убедиться, что рабочий процесс выполняется асинхронно. Вот соответствующие части кода:

Проверка наличия только одного экземпляра 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);
}

РЕДАКТИРОВАТЬ: Изменено название поста, чтобы получить больше просмотров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...