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 contextAsyncCallback callbackobject state)
        {
                        string tempFileName = Path.GetTempFileName();
            Console.WriteLine("Writing to file: " + tempFileName);
 
            FileStream file = File.Open(tempFileNameFileMode.Create);
 
            context.UserState = file;
 
            byte[] bytes = UnicodeEncoding.Unicode.GetBytes("123456789");
            return file.BeginWrite(bytes, 0, bytes.Lengthcallbackstate);
        }
 
   2    protected override void EndExecute(AsyncCodeActivityContext contextIAsyncResult 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
一个用户提供的对象,它将该特定的异步写入请求与其他请求区别开来。

返回值

类型:System.IAsyncResult
表示异步写入的 IAsyncResult(可能仍处于挂起状态)。

BeginWrite 在流上的默认实现将同步调用 Write 方法,这意味着 Write 在某些流上可能发生阻塞。 但是,如果已经异步打开

某些类(如 FileStreamNetworkStream)的实例,则这些实例将完全支持异步操作。 因此,对 BeginWrite 的调用不会在

那些流上阻塞。 可以重写 BeginWrite(例如,使用异步委托)以提供异步行为。

将当前方法返回的 IAsyncResult 传递给 EndWrite 以确保写入操作完成并相应地释放资源。 每次调用 BeginWrite 时都必须

调用一次 EndWrite 这可以通过与调用 BeginWrite 相同的代码来完成,或者在传递给 BeginWrite 的回调中完成。 如果在异

步写入期间发生错误,则在使用此方法返回的 IAsyncResult 调用 EndWrite 之前,不会引发异常。



 

posted @ 2011-05-22 15:28  庖丁解.NET  阅读(257)  评论(0)    收藏  举报