zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看