工作流中的活动就像用户自定义的控件,将许多的功能封装起来用。WF4.0中提供了四种可继承的活动 类:CodeActivity 、AsyncCodeActivity、Activity、NativeActivity。这几种活动都有自己使用的适合 场合,正确的使用这些活动将非常有利。
1、CodeActivity
WF4.0中的活动是树形结构的,创建叶子活动最简单是方式就是使用CodeActivity ,它的逻辑都放在 一个方法:Execute 里面,这个也是四种活动中最简单的一种。这里用一个简单的自定活动HttpGet来说 明怎么使用CodeActivity。HttpGet的功能是从网络上抓取数据。
public sealed class HttpGet : CodeActivity<string>
{
public InArgument<string> Uri { get; set; }
protected override string Execute(CodeActivityContext context)
{
WebRequest request = HttpWebRequest.Create(this.Uri.Get (context));
using (WebResponse response = request.GetResponse())
{
//read everything response.GetResponseStream() as one string
using (StreamReader reader = new StreamReader (response.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
}
}
public InArgument<string> Uri { get; set; }是工作流中的一个属性,相当于类的属性,不 过取它的值与类有点不同,你需要使用:Uri.Get(context))或者 context.GetValue(Uri),Execute方法 是这个活动的逻辑,特别注意CodeActivityContext context参数,这是WF的上下文,非常有用。
如何使用这个活动:
HttpGet fetchMsn = new HttpGet
{
Uri = "http://www.msn.com"
};
string msnContent = WorkflowInvoker.Invoke<string>(fetchMsn);
Console.WriteLine(msnContent);
2、AsyncCodeActivity
AsyncCodeActivity 类似CodeActivity ,只是它是使用了 Begin/EndExecute 取代了CodeActivity 的Execute 方法。BeginExecute 开始一个异步操作,无需等待它完成,就返回IAsyncResult对象 。当这 个操作完成的时候,就执行EndExecute 方法放回结果。HttpGet 能这样实现,请注意 CodeActivityContext换成了AsyncCodeActivityContext:
class HttpGet : AsyncCodeActivity<string>
{
public InArgument<string> Uri { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
WebRequest request = HttpWebRequest.Create(this.Uri.Get (context));
context.UserState = request;
return request.BeginGetResponse(callback, state);
}
protected override string EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
WebRequest request = (WebRequest)context.UserState;
using (WebResponse response = request.EndGetResponse (result))
{
using (StreamReader reader = new StreamReader (response.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
}
}