stevenhqq

无知逼着我不断学习,唯有这种方式,才能感觉自己还有点价值。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

看完 GuoYong.Che 翻译的【翻译】WF从入门到精通(第八章):调用外部方法及工作流 的一些体会。

   

   

【翻译】WF从入门到精通(第八章):调用外部方法及工作流 的案例中,有一些地方确实让我郁闷了一把,还记得第一天看得时候,彻底受打击了。哪个案例很多地方我都不知道怎么来的。感觉以前看的那些东西,都在这个章节中被搅的一塌糊涂,彻彻底底的成为了浆糊。 第二天看到时候还是那样,没辙,再次访问GuoYong.Che的blog的时候,gshope 朋友的留言提醒了我去看MSDN(ms-help://MS.MSDNQTR.v90.chs/wf_gettingstarted/html/f0f2b66f-8bad-4ac7-a525-050c6389e453.htm),这份文档,我早先就看过几遍,但是收获不大。这次再次看的时候,才领悟到"演示本地通信服务如何与其主机应用程序通信"那幅图的含义了。有所领悟就得试试看。

我自己编写了一个小案例。用于来实践我所领悟到的内容。看看是否是我所理解的那样。

具体实现如下:

   

   

通过模拟下载功能,来理解工作流与本地外部应用程序的通信过程。

   

工作流程如图所示。

   

具体说明:

1.handleExternalEventActivity1用于接收外部应用程序通知,开始模拟下载数据。(Invoked为InitData方法,用于初始化模拟下载的进度。)

2.whileActivity1用于模拟下载进度的变化。

3.sequenceActivity1用于承载多个用于whileActivity1的活动。

4.delayActivity1用于延时,模拟下载时的速度。

5.codeActivity1用于设置当前模拟下载的进度。

6.callExternalMethodActivity1和2用于告知外部应用程序当前模拟下载的进度。该活动与MyDownloadWFDataService.IDownLoadSevice相关联,并绑定到该接口的DownLoadercent方法。该活动执行时,将调用DownLoadercent方法告知外部应用程序当前进度。

   

   

外部应用程序和工作流通信可以通过接口来实现,说明请参加MSDN帮助文档:ms-help://MS.MSDNQTR.v90.chs/wf_gettingstarted/html/f0f2b66f-8bad-4ac7-a525-050c6389e453.htm

由此文档我们可以看出,工作流可以接收事件,来处理外部应用程序的通知。并且可以调用方法来向外部应用程序反馈信息。利用该特征,我们就可以实现外部应用程序与工作流通信。

不过我们首先的实现通信的接口,文中明确标明必须使用接口来实现工作流与外部应用程序的通信。

   

所以我编写了一个MyDownloadWFDataService.IDownLoadSevice接口,该接口有一个事件和一个方法。代码如下:

/// <summary>

/// 工作流和外部应用程序通信的接口

/// </summary>

[ExternalDataExchange]

public interface IDownLoadSevice

{

/// <summary>

/// 用于外部向工作流传递信息

/// 通知工作流开始下载

/// </summary>

event EventHandler<DownLoadEventArgs> StartDownload;

   

/// <summary>

/// 用于工作流向外部通信

/// 报告下载进度

/// </summary>

/// <param name="currentData">当前下载进度</param>

void DownLoadercent(int currentData);

}

   

有了该接口,那么我们就可以在工作流中设置通信的接口了。也就是设置

handleExternalEventActivity1所关联的事件,和callExternalMethodActivity1和2所关联的方法。记得在上述两个活动中设置他们的interfaceType为MyDownloadWFDataService.IDownLoadSevice接口。做完这些后,那么工作流与外部应用程序通讯,在工作流方面的准备工作就完成了。

   

下一步准备外部应用程序这一方面的工作。

外部应用程序不能直接使用上面所编写的接口来和应用程序来通讯,所以,我们必须编写一个类来实现该接口。代码如下:

public class DownLoadService:IDownLoadSevice

{

#region IDownLoadSevice 成员

   

/// <summary>

/// 通知工作流开始下载事件

/// </summary>

public event EventHandler<DownLoadEventArgs> StartDownload;

   

/// <summary>

/// 通知工作流开始下载

/// </summary>

/// <param name="instanceID"></param>

public void StartDown(Guid instanceID)

{

//调用开始下载事件,通知工作流开始下载

this.StartDownload(null, new DownLoadEventArgs(instanceID));

}

   

/// <summary>

/// 被工作流调用的方法,通知外部应用程序当前下载进度发生更改

/// </summary>

/// <param name="currentData">当前进度</param>

public void DownLoadercent(int currentData)

{

//通知界面显示当前进度

this.SetDownLoadData(null,new DownloadDataEventArgs(currentData));

}

   

#endregion

   

/// <summary>

/// 当工作流内部向外部报告进度时,通过该事件设置界面数据显示

/// 用于在界面设置下载进度事件

/// </summary>

public event EventHandler<DownloadDataEventArgs> SetDownLoadData;

}

   

   

IDownLoadSevice 成员所实现的方法StartDown为外部应用程序通过该方法启动StartDownload事件来通知工作流开始执行下载任务。

DownLoadercent方法为当工作流向外部应用程序报告下载进度时(工作流向外部应用程序发送数据)被工作流调用的方法,该方法内部调用了我们自己编写的事件SetDownLoadData,来通知外部应用程序有数据来了。为什么这里需要调用事件呢?也许大家会有这种疑问,在此处,我们无法知道工作流什么时候才会来数据,而外部应用程序也无法采用方法调用的形式来获取这个数据,所以我们编写了这个事件,采用事件通知的形式来告诉外部应用程序,工作流有数据传递过来了。下载进度就包含在这个事件的参数中DownloadDataEventArgs。外部应用程序只需要注册该事件,并实现处理程序就能获取该事件的数据了。这也就达到了从工作流传递数据到DownLoadSer

vice并通过DownLoadService中继后转给外部应用程序的目的。

   

   

本例子写完后确实让我理解了一些关于工作流与本地应用程序通信的问题。案例也许举的不是很好,着重在工作流与本地应用程序通讯方面,所以也没有去多理会。如果大家有其他方面的一些心得,欢迎一起来交流共享。

   

   

具体代码:

posted on 2009-02-06 18:29  撕体分黑蛐蛐  阅读(549)  评论(3编辑  收藏  举报