惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 妖居

ASP.NET MVC Tips #2 - 令人混乱的Get、Post、Return View和Return Redirect ASP.NET MVC Tips #1 - 支持上传文件的ModelBinder How to migrate MsSql database to MySql 使用异步委托解决Windows Application应用Duplex Service时出现的Deadlock问题 字节数组、数值和十六进制字符串的转换 表格化固定长、CSV文件编辑器工具 iMatrixitor 发布 Getting Started With LINQ in Visual Basic (翻译 + 评论) 使用接口实现附带插件功能的程序 两个简单方法加速DataGridView 使用.NET自带的功能制作简单的注册码 不是说“Peek 不会更改 StreamReader 的当前位置”么。MS骗人的! 《Introducing Visual Basic 2005》中看到的一些VB2005的新特性 VB.NET函数的返回值问题(从CSDN论坛一个问题想到的) Add-in and Automation Development In VB.NET 2003 (Finished) Add-in and Automation Development In VB.NET 2003 (8) 模拟IE地址栏的TextBox小控件 Add-in and Automation Development in VB.NET 2003 (6-7) 在WinXP环境下显示XP风格的控件 Add-in and Automation Development In VB.NET 2003 (5)
Windows Workflow Foundation 使用小例
妖居 · 2007-06-28 · via 博客园 - 妖居

Windows Workflow Foundation(以下简称WWF)为我们提供了一种定义工作流的方式,依靠Visual Studio Orcas Beta 1(以下简称VS9),可以通过图形界面定义一个业务的工作流程,进而在代码页实现工作流的工作细节。使用工作流的时候只需要简单的启动这个流程就可以了。如果工作流发生了变化,那么只需要修改工作流Project里面的流程或者实现,对于工作流的使用者来说不用修改代码。
在VS9里面,可以通过 New > Project > Wokkflow > Sequential Workflow Library 建立一个顺序流程的工作流工程。

VS9建立一个默认的工作流对象Workflow1,通过左侧的Toolbox就可以设计工作流了。简单得很,我们现在做一个详细设计到单元测试的工作流,详细设计需要Review,代码走查是可选的工作,他们和单元测试都是只有通过了才能进入下一阶段。直接看图。

而对于工作流里面的关键工作和判断,都需要在代码中给与实现,比如详细设计Review,首先需要实现是否通过Review的实现。
选择DsReviewNG这个While类型的工作流单元,在Property Window里面可以看到一个Condition属性,他就是我们要实现的具体操作。选择Code Condition表示通过代码实现,然后写入函数名称(很想为Event Handle函数那样),VS9将会自动跳转到代码页生成我们需要的代码。

注意第二个参数ConditionalEventArgs,他的属性Result负责返回这个判断的结果给工作流。所以我们的判断结果要赋给这个变量。

        private void IsDsReviewNg(object sender, ConditionalEventArgs e)
        
{
            e.Result 
= !m_isDsReviewOk;
        }

同样的方法实现所有的内容,工作流就做好了。但是现在这个工作刘海不能使用,因为他只定义了一个流程,需要一个客户端区使用这个流程。
在建立一个Project,可以使ConsoleApplication,引入刚才这个工作流的Project Reference和System.Workflow.Activities、System.Workflow.ComponentModel和System.Workflow.Runtime。为了好看,建立一个新的类来执行工作流。

    public class WfExecutor
    
{
        
private WorkflowRuntime wfr;
        
private ExternalDataExchangeService edes;
        
private System.Threading.AutoResetEvent waitHandler;

        
public WfExecutor()
        
{
            wfr 
= new WorkflowRuntime();
            edes 
= new ExternalDataExchangeService();
            wfr.AddService(edes);

            waitHandler 
= new System.Threading.AutoResetEvent(false);

            wfr.Started 
+= delegate { Console.WriteLine("WorkflowRuntime is started."); };
            wfr.Stopped 
+= delegate { Console.WriteLine("Workflow is stroped."); };
            wfr.WorkflowTerminated 
+= delegate { waitHandler.Reset(); };
        }


        
public void Execute()
        
{
            wfr.StartRuntime();
            WorkflowInstance ins 
= wfr.CreateWorkflow(typeof(UsingWF.Workflow1));
            waitHandler.Set();
            ins.Start();
            waitHandler.WaitOne();
            wfr.StopRuntime();
            waitHandler.Reset();
            waitHandler.Close();
        }

    }

其中还有很多我也不是很清楚的东西。目前来讲,为了使用工作流,首先要建立一个WorkflowRuntime,我的感觉像是一个负责运行工作流的平台。还需要一个数据交换服务ExternalDataExchangeService。但是不知道为什么需要。最后通过WorkflowRuntime的CreateWorkflow方法建立我们的工作流对象。(肯定是通过反射建立出来的。)执行Start方法就可以启动工作流了。可以看出,启动工作流和工作流本身没有任何关系,所以修改了工作流也不需要修改调用端的代码。
但是为什么还需要waitHandler.Set()、waitHandler.WaitOne()等这些操作呢?因为默认的,工作流将会使用一个新的线程执行。为了让主线程能够等待工作流的结束,这里是用了一个.Net Fx3里面新的类System.Threading.AutoResetEvent。目前的MSDN对这个类介绍很少,我个人的理解是它可以将当前进程里面的主线程挂断,然后运行子线程,直到子线程结束之后释放主线程。
具体的介绍可以看MSDN的相关部分。
运行起来就是这个样子的……

红框里面的部分就是工作流的输出。
对于工作流,本人只是开始接触,这个例子主要是根据 netfx3 上面 Sudoku 的一部分做的。对于WWF还有很多不清楚的地方,比如WWF里面的数据怎么和调用方交互,可能就要用到ExternalDataExchangeService了。而且对于AutoResetEvent仍然不是很明白。这个立即在运行的时候,有可能会出现工作流没有正常启动的情况,多次运行就会正常。但是究竟是什么原因,我感觉是AutoResetEvent使用不当造成的。也欢迎有相关经验的高人指点一二。

源代码下载(适用于Visual Studio Orcas Beta 1)

参考资料
Sudoku(http://wcf.netfx3.com/files/folders/distributed_applications/entry4543.aspx