EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:减少工作流服务的内存消耗

当前工作流服务器实施不是针对经常更改工作流定义(1分钟)的方案而设计的,应该在短时间内启动更新的版本。刷新操作是在HostManagerActivityProvider类的帮助下执行的,该类使用AssemblyBuilder类从XAML字符串创建活动。这种方法允许最终用户在工具箱上添加运行时活动,并将这些活动作为运行时工作流设计器中的组件重用。因此,每次刷新操作都会创建一个新的程序集,并将其加载到当前的AppDomain中。此操作需要额外的非托管内存(每个程序集大约100Kb)。当整个AppDomain都卸载时,所有已加载的程序集均被卸载对象已卸载。该HostManagerActivityProvider类不作任何检查,总是创建一个新的装配。这就是使用的非托管内存不断增长的原因。本主题说明了如何实现自定义HostManagerActivityProvider类,该类不需要额外的内存,但是不允许重用运行时活动。

注意
  • 或者,您可以将RefreshWorkflowDefinitionsService.DelayPeriod值提高到一个小时(请参阅Workflow Server服务),并在必要时手动强制执行刷新操作。
  • 移动应用程序不支持工作流模块,因此本主题中描述的方法无法在移动平台中实现。
  • 将以下类添加到Workflow Server Service项目。

    using System.IO;
    using System.Activities;
    using System.Activities.XamlIntegration;
    using DevExpress.ExpressApp.Workflow;
    using DevExpress.ExpressApp.Workflow.Server;
    using DevExpress.ExpressApp.Workflow.CommonServices;
    // ...
    public class CustomHostManagerActivityProvider : DevExpress.ExpressApp.Workflow.Server.WorkflowServerService {
        private void Manager_HostOpening(object sender, EventArgs e) {
            IList<IWorkflowDefinition> definitions = 
                GetService<IWorkflowDefinitionProvider>().GetDefinitions();
            Dictionary<string, Activity> activities = new Dictionary<string, Activity>();
            foreach(IWorkflowDefinition definition in definitions) {
                if(definition.CanOpenHost) {
                    Activity activity = ActivityXamlServices.Load(new StringReader(definition.Xaml));
                    activity.DisplayName = definition.GetActivityTypeName();
                    activities.Add(definition.GetUniqueId(), activity);
                }
            }
            HostManager.RefreshHosts(activities);
        }
        protected override void OnInitialized() {
            base.OnInitialized();
            HostManager.HostsOpening  = Manager_HostOpening;
        }
    }
    
  • 打开WorkflowServerService.csWorkflowServerService.vb)文件。在OnStart方法中,将CustomHostManagerActivityProvider类的实例分配给WorkflowServer.HostManagerActivityProvider属性。

    server = new WorkflowServer("http://localhost:46232", objectSpaceProvider, objectSpaceProvider);
    server.HostManagerActivityProvider = new CustomHostManagerActivityProvider();
    
相关文章

转载保留此链接,注明出处