没有合适的资源?快使用搜索试试~ 我知道了~
首页workflow_foundation_个人整理的一些使用工作流例子
workflow_foundation_个人整理的一些使用工作流例子
需积分: 12 11 下载量 55 浏览量
更新于2023-03-16
评论
收藏 396KB DOC 举报
C#实现的常用工作流事例.事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序。通过事件与工作流进行通信的功能提供了一种将数据发送到工作流的异步方式。
资源详情
资源评论
资源推荐
工作流包装
1. 运行时包装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workow.Runtime;
namespace Nocturne.Workow.Hosting
{
public class WorkowRuntimeManager:IDisposable
{
private WorkowRuntime _workowRuntime;
private Dictionary<Guid, WorkowInstanceWrapper> _workows = new Dictionary<Guid,
WorkowInstanceWrapper>();
public WorkowRuntimeManager(WorkowRuntime instance)
{
_workowRuntime = instance;
if (instance == null)
{ throw new NullReferenceException("需要一个非空的 WorkowRuntime 实例"); }
// 提交所有的工作流事件
SubscribeToEvents(instance);
}
/// <summary>
/// 创建并启动一个工作流。
/// </summary>
/// <param name="workowType">待启动的工作流类型</param>
/// <param name="parameters">入口参数</param>
/// <returns>包装在一个WorkowInstanceWrapper里的工作流实例</returns>
public WorkowInstanceWrapper StartWorkow(Type workowType, Dictionary<string,
object> parameters)
{
WorkowInstance instance = _workowRuntime.CreateWorkow(workowType,
parameters);
WorkowInstanceWrapper wrapper = AddWorkowInstance(instance);
instance.Start();
return wrapper;
}
#region 公共属性和事件
/// <summary>
/// 获取WorkowRuntime实例
/// </summary>
public WorkowRuntime WorkowRuntime
{ get { return _workowRuntime; } }
/// <summary>
/// 获取工作流实例包装的一个字典
/// </summary>
public Dictionary<Guid, WorkowInstanceWrapper> Workows
{ get { return _workows; } }
/// <summary>
/// 记录该类的日志信息的事件
/// </summary>
public event EventHandler<WorkowLogEventArgs> MessageEvent;
#endregion
#region 工作流集合管理
/// <summary>
/// 从工作流字典中移除某个实例
/// </summary>
/// <param name="workowId"></param>
public void ClearWorkow(Guid workowId)
{ if (_workows.ContainsKey(workowId))
{ _workows.Remove(workowId); }
}
/// <summary>
/// 从字典中清除所有的工作流
/// </summary>
public void ClearAllWorkows() {
_workows.Clear();
}
/// <summary>
/// 向字典中添加一个新的工作流实例
/// </summary>
/// <param name="instance"></param>
/// <returns></returns>
private WorkowInstanceWrapper AddWorkowInstance(WorkowInstance instance)
{ WorkowInstanceWrapper wrapper = null;
if (!_workows.ContainsKey(instance.InstanceId))
{ wrapper = new WorkowInstanceWrapper(instance);
_workows.Add(wrapper.Id, wrapper);
} return wrapper;
}
/// <summary>
/// 依据Guid查找工作流实例
/// </summary>
/// <param name="workowId"></param>
/// <returns></returns>
public WorkowInstanceWrapper FindWorkowInstance(Guid workowId)
{ WorkowInstanceWrapper result = null;
if (_workows.ContainsKey(workowId))
{ result = _workows[workowId]; }
return result;
}
/// <summary>
/// 等待所有的工作流实例完成
/// </summary>
/// <param name="msecondsTimeout"></param>
public void WaitAll(int msecondsTimeout)
{
if (_workows.Count > 0)
{
WaitHandle[] handles = new WaitHandle[_workows.Count];
int index = 0;
foreach (WorkowInstanceWrapper wrapper in _workows.Values)
{
handles[index] = wrapper.WaitHandle;
index++;
}
WaitHandle.WaitAll(handles, msecondsTimeout, false);
}
}
#endregion
#region IDisposable Members
/// <summary>
/// 销毁工作流运行时
/// </summary>
public void Dispose()
{
if (_workowRuntime != null)
{
_workowRuntime.StopRuntime();
_workowRuntime.Dispose();
}
ClearAllWorkows();
}
#endregion
#region 工作流事件处理
/// <summary>
/// 订阅我们所有关心的事件
/// </summary>
/// <param name="runtime"></param>
private void SubscribeToEvents(WorkowRuntime runtime)
{
runtime.Started += new
EventHandler<WorkowRuntimeEventArgs>(runtime_Started);
runtime.Stopped += new
EventHandler<WorkowRuntimeEventArgs>(runtime_Stopped);
runtime.WorkowAborted += new
EventHandler<WorkowEventArgs>(runtime_WorkowAborted);
runtime.WorkowCompleted += new
EventHandler<WorkowCompletedEventArgs>(runtime_WorkowCompleted);
runtime.WorkowCreated += new
EventHandler<WorkowEventArgs>(runtime_WorkowCreated);
runtime.WorkowIdled += new
EventHandler<WorkowEventArgs>(runtime_WorkowIdled);
runtime.WorkowLoaded += new
EventHandler<WorkowEventArgs>(runtime_WorkowLoaded);
runtime.WorkowPersisted += new
EventHandler<WorkowEventArgs>(runtime_WorkowPersisted);
runtime.WorkowResumed += new
EventHandler<WorkowEventArgs>(runtime_WorkowResumed);
runtime.WorkowStarted += new
EventHandler<WorkowEventArgs>(runtime_WorkowStarted);
runtime.WorkowSuspended += new
EventHandler<WorkowSuspendedEventArgs>(runtime_WorkowSuspended);
runtime.WorkowTerminated += new
EventHandler<WorkowTerminatedEventArgs>(runtime_WorkowTerminated);
runtime.WorkowUnloaded += new
EventHandler<WorkowEventArgs>(runtime_WorkowUnloaded);
}
void runtime_Started(object sender, WorkowRuntimeEventArgs e)
{
LogStatus(Guid.Empty, "Started");
}
void runtime_Stopped(object sender, WorkowRuntimeEventArgs e)
{
LogStatus(Guid.Empty, "Stopped");
}
void runtime_WorkowCreated(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowCreated");
}
void runtime_WorkowStarted(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowStarted");
}
void runtime_WorkowIdled(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowIdled");
}
void runtime_WorkowCompleted(object sender, WorkowCompletedEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowCompleted");
WorkowInstanceWrapper wrapper =
FindWorkowInstance(e.WorkowInstance.InstanceId);
if (wrapper != null)
{
wrapper.OutputParameters = e.OutputParameters;
wrapper.StopWaiting();
}
}
void runtime_WorkowTerminated(object sender, WorkowTerminatedEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowTerminated");
WorkowInstanceWrapper wrapper =
FindWorkowInstance(e.WorkowInstance.InstanceId);
if (wrapper != null)
{
wrapper.Exception = e.Exception;
wrapper.StopWaiting();
}
}
void runtime_WorkowSuspended(object sender, WorkowSuspendedEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowSuspended");
WorkowInstanceWrapper wrapper =
FindWorkowInstance(e.WorkowInstance.InstanceId);
if (wrapper != null) {
wrapper.ReasonSuspended = e.Error;
}
}
void runtime_WorkowResumed(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowResumed");
}
void runtime_WorkowPersisted(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowPersisted");
}
void runtime_WorkowLoaded(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowLoaded");
}
void runtime_WorkowAborted(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowAborted");
WorkowInstanceWrapper wrapper =
FindWorkowInstance(e.WorkowInstance.InstanceId);
if (wrapper != null)
{
wrapper.StopWaiting();
}
}
void runtime_WorkowUnloaded(object sender, WorkowEventArgs e)
{
LogStatus(e.WorkowInstance.InstanceId, "WorkowUnloaded");
}
private void LogStatus(Guid instanceId, String msg)
{
if (MessageEvent != null)
{
String formattedMsg;
if (instanceId == Guid.Empty)
{
formattedMsg = String.Format("Runtime - {0}", msg);
}
else
{
formattedMsg = String.Format("{0} - {1}", instanceId, msg);
}
// 引发事件
MessageEvent(this, new WorkowLogEventArgs(formattedMsg));
}
}
#endregion
}
/// <summary>
/// 在管理类中用来记录日志信息的EventArgs
/// </summary>
public class WorkowLogEventArgs : EventArgs
{
private string _msg = string.Empty;
public WorkowLogEventArgs(string msg)
{
_msg = msg;
}
public string Message
{ get { return _msg; } }
}
}
2. 工作流实例包装
using System;
using System.Collections.Generic;
using System.Threading;
using System.Workow.Runtime;
namespace Nocturne.Workow.Hosting
{
/// <summary>
/// 工作流实例的容器
/// </summary>
[Serializable]
public class WorkowInstanceWrapper
{
private WorkowInstance _workowInstance;
private ManualResetEvent _waitHandle = new ManualResetEvent(false);
private Dictionary<string, object> _outputParameters = new Dictionary<string,
object>();
private Exception _exception;
private string _reasonSuspended = string.Empty;
public WorkowInstanceWrapper(WorkowInstance instance)
{ _workowInstance = instance; }
#region 公开属性与方法
/// <summary>
/// 获取工作流实例的 ID
/// </summary>
public Guid Id
{
剩余23页未读,继续阅读
乐观的猴子
- 粉丝: 11
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 数据结构1800题含完整答案详解.doc
- 医疗企业薪酬系统设计与管理方案.pptx
- 界面与表面技术界面理论与表面技术要点PPT学习教案.pptx
- Java集合排序及java集合类详解(Collection、List、Map、Set)讲解.pdf
- 网页浏览器的开发 (2).pdf
- 路由器原理与设计讲稿6-交换网络.pptx
- 火电厂锅炉过热汽温控制系统设计.doc
- 企业识别CIS系统手册[收集].pdf
- 物业管理基础知识.pptx
- 第4章财务预测.pptx
- 《集成电路工艺设计及器件特性分析》——实验教学计算机仿真系.pptx
- 局域网内共享文件提示没有访问权限的问题借鉴.pdf
- 第5章网络营销策略.pptx
- 固井质量测井原理PPT教案.pptx
- 毕业实习总结6篇.doc
- UGNX建模基础篇草图模块PPT学习教案.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0