WF4.0 基础篇 (二十四) Async Activity

 

例子下载:

https://files.cnblogs.com/foundation/AsyncCodeActivitySample.rar

 

项目说明:

Async Activity

Async的意思是异步,但有一点一定要注意,不能按字面理解,该Activity的功能是以同步的方式调用异步方法的Activity

建议看过[WF4.0 基础篇 (十三) InvokeMethod 调用方法 ]后,再看本文

 

 

类名

System.Activities.AsyncCodeActivity

文件

System.Activities.dll

结构说明

继承 Activity

是一个 abstract类

override 了 [CacheMetadata方法]

提供两个 abstract方法 [BeginExecute],[EndExecute]

功能说明

AsyncCodeActivity的主要目的是实现当Activity中有异步操作时,如何等待有异步完成后才向下执行的问题,也就是说如何将并行变为串行

 

 

类名

System.Activities.AsyncCodeActivity<TResult>

文件

System.Activities.dll

结构说明

继承 Activity<TResult>

是一个 abstract类

override 了 [CacheMetadata方法]

提供两个 abstract方法 [BeginExecute],[EndExecute]

功能说明

与AsyncCodeActivity,可以在[EndExecute]方法中return 返回值

 

 

 

 

 

 

 

例1:AsyncCodeActivity

等待[BeginXXX]方法(以FileStream.BeginWrite为例)

 

myAsyncWriteFile

public sealed class myAsyncWriteFile: AsyncCodeActivity

{

public InArgument<string> fileName

{

set;

get;

}

 

public InArgument<string> fileData

{

set;

get;

}

 

protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)

{

string fn = context.GetValue(fileName);

string fd = context.GetValue(fileData);

 

System.Console.WriteLine("开始写入文件");

FileStream fileStream = File.Open(fn, FileMode.Create);

context.UserState = fileStream;

byte[] bytes = UnicodeEncoding.Unicode.GetBytes(fd);

IAsyncResult r = fileStream.BeginWrite(bytes, 0, bytes.Length, callback, state);

return r;

}

 

protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)

{

System.Threading.Thread.Sleep(5000);

 

FileStream file = (FileStream)context.UserState;

file.EndWrite(result);

file.Flush();

file.Close();

System.Console.WriteLine("写入文件完成");

}

}

流程

宿主

WorkflowInvoker.Invoke(new myAsyncWriteFileWorkflow());

结果

 

例2:AsyncCodeActivity<TResult>

等待[BeginXXX]方法(以FileStream.BeginWrite为例)

 

myAsyncWriteFileByResult

public sealed class myAsyncWriteFileResult : AsyncCodeActivity<string>

{

public InArgument<string> fileName

{

set;

get;

}

 

public InArgument<string> fileData

{

set;

get;

}

 

protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)

{

string fn = context.GetValue(fileName);

string fd = context.GetValue(fileData);

 

System.Console.WriteLine("开始写入文件");

FileStream fileStream = File.Open(fn, FileMode.Create);

context.UserState = fileStream;

byte[] bytes = UnicodeEncoding.Unicode.GetBytes(fd);

IAsyncResult r = fileStream.BeginWrite(bytes, 0, bytes.Length, callback, state);

return r;

}

 

protected override string EndExecute(AsyncCodeActivityContext context, IAsyncResult result)

{

System.Threading.Thread.Sleep(5000);

 

FileStream file = (FileStream)context.UserState;

file.EndWrite(result);

file.Flush();

file.Close();

System.Console.WriteLine("写入文件完成");

return "写入成功";

}

 

 

}

流程

宿主

 

WorkflowInvoker.Invoke(new myAsyncWriteFileByResultWorkflow());

结果

 

 

原文地址:https://www.cnblogs.com/foundation/p/1690519.html