WF学习备忘(2)
Async 是异步的意思,但是它的功能是以同步的方式调用异步方法的Activity。AsyncCodeActivity,继承 Activity 是一个 abstract类 ,override 了 [CacheMetadata方法] ,提供两个 abstract方法 [BeginExecute],[EndExecute]。AsyncCodeActivity的主要目的是实现当Activity中有异步操作时,如何等待有异步完成后才向下执行的问题,也就是说如何将并行变为串行。
微软给的例子:
static void Main() { FileWriter writer = new FileWriter(); WorkflowInvoker.Invoke(writer); Console.WriteLine("Hit <enter> to exit..."); Console.ReadLine(); }
FileWriter:::::::::::::::::::::::::::::public sealed class FileWriter : AsyncCodeActivity { public FileWriter() : base() { } 1 protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { string tempFileName = Path.GetTempFileName(); Console.WriteLine("Writing to file: " + tempFileName); FileStream file = File.Open(tempFileName, FileMode.Create); context.UserState = file; byte[] bytes = UnicodeEncoding.Unicode.GetBytes("123456789"); return file.BeginWrite(bytes, 0, bytes.Length, callback, state); } 2 protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) { System.Threading.Thread.Sleep(2000);FileStream file = (FileStream)context.UserState; try { file.EndWrite(result); file.Flush(); } finally { file.Close(); } } }结果:Writing to file: C:\Documents and Settings\Administrator\Local Settings\Temp\tmp
A4.tmp(2s后显示下面)
Hit <enter> to exit...另:Stream.BeginWrite 方法
BeginWrite(
byte[] buffer,
int offset,
int count,
AsyncCallback callback,
Object state
)参数
- buffer
- 类型:System.Byte[]
从中写入数据的缓冲区。
- offset
- 类型:System.Int32
buffer 中的字节偏移量,从此处开始写入。
- count
- 类型:System.Int32
最多写入的字节数。
- callback
- 类型:System.AsyncCallback
可选的异步回调,在完成写入时调用。
- state
- 类型:System.Object
一个用户提供的对象,它将该特定的异步写入请求与其他请求区别开来。返回值
BeginWrite 在流上的默认实现将同步调用 Write 方法,这意味着 Write 在某些流上可能发生阻塞。 但是,如果已经异步打开
某些类(如 FileStream 和 NetworkStream)的实例,则这些实例将完全支持异步操作。 因此,对 BeginWrite 的调用不会在
那些流上阻塞。 可以重写 BeginWrite(例如,使用异步委托)以提供异步行为。
将当前方法返回的 IAsyncResult 传递给 EndWrite 以确保写入操作完成并相应地释放资源。 每次调用 BeginWrite 时都必须
调用一次 EndWrite。 这可以通过与调用 BeginWrite 相同的代码来完成,或者在传递给 BeginWrite 的回调中完成。 如果在异
步写入期间发生错误,则在使用此方法返回的 IAsyncResult 调用 EndWrite 之前,不会引发异常。
浙公网安备 33010602011771号