ReplicatorActivity容器,CorrelationToken关联CallExternalMethod与HandleExternalEvent的演示
先看一下基本流程的草图
说一下用WF的实现思路
1.设计[表决人发表意见]的Activity,这是一个通知,回复的过程,所以用一个组CallExternalMethod与HandleExternalEvent实现通知与等待回复
2.由于参与人数是不特定的,但所有参与人的参与流程是一样的,所在使用一个ReplicatorActivity容器创建[表决人发表意见]的Activity多个复本
3.表决是并发的,所以ReplicatorActivity容器应设为并发
4.由于存在多个[表决人发表意见]的Activity的HandleExternalEvent同时等待,这样新需要使用CorrelationToken关联CallExternalMethod与HandleExternalEvent
5.由于参与人数不确定,ReplicatorActivit的InitialChildData集合需要在启动流程时由用户定义户后传入
数据项类
public class DataItem

{
public DataItem(string partakeName)

{
this.PartakeName = partakeName;
}
public string PartakeName;
public string Result;
}

allExternalMethod与HandleExternalEvent绑定类
使用
System.Workflow.Activities.CorrelationParameter
System.Workflow.Activities.CorrelationInitializer
System.Workflow.Activities.CorrelationAlias
为CallExternalMethod与HandleExternalEvent实现关联
//接口
[System.Workflow.Activities.ExternalDataExchange]
[System.Workflow.Activities.CorrelationParameter("PartakeName")]
public interface IExternalEvent

{
[System.Workflow.Activities.CorrelationInitializer]
void CreateBallot(string PartakeName, object value);
//关联参数
//对应到事件的属性
[System.Workflow.Activities.CorrelationAlias("PartakeName", "e.PartakeName")]
event EventHandler<EventArgs> WxdEvent;
}
//事件参数
[Serializable]
public class EventArgs : System.Workflow.Activities.ExternalDataEventArgs

{
public string Result;
private string _PartakeName;
public string PartakeName

{

get
{ return _PartakeName; }

set
{ _PartakeName = value; }
}

public EventArgs(Guid instanceId, string PartakeName)
: base(instanceId)

{
_PartakeName = PartakeName;
}
}

//接口实现类
public class WxdExternalEvent : IExternalEvent

{
//实现接口事件
public event EventHandler<EventArgs> WxdEvent;
//实现接口方法
public void CreateBallot(string PartakeName, object value)

{
System.Console.WriteLine("通知{0}参与表决" , PartakeName);
}

//触发事件
public void OnWxdEvent(Guid instanceId, string PartakeName, string Result)

{
EventArgs e = new EventArgs(instanceId, PartakeName);
e.Result = Result;
WxdEvent(null, e);
}
}

自定义投票Activity
工作流设计
引警
代码下载
https://files.cnblogs.com/foundation/WorkflowLibrary3.rar
补充一下
以上例子是为了演示ReplicatorActivity的使用,以及使用CorrelationToken关联CallExternalMethod与HandleExternalEvent。
在实际应用中[表决人发表意见]的Activity可以做如下设计
如果参与人没有在指定的事间内进行表决,系统将按超时处理,这样可以避免某个用户不表决,使整个流程一直处于挂起状态。在实例应用中,delay通常不直接用作业务结点,而是独立的实现一个时间引擎,这样处理工作日、节假日、申请延期处理等方面比效灵活
还有,如果可以不需要所有的参与人都完成表决流程才继续向下运行,可以加入规则判断,当同意或不同意的达到一定票数后新直接显示结果,当然这要看实际的业务是否有这种要求
添加上述功能比效简单,这里就不提供代码了
测试通过后,将引擎与客户端分别封装,
引擎可以选择Win服务,COM+,IIS的Application作为宿主
客户端可以选择WinForm、WEB
当然还要选择一种通信方式,WebService、Remoting、WCF、TCP都可以
以上的各种组合的例子都写过,这里也就不再提供了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)