天天看點

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

例子下載下傳:

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

項目說明:

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

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 傳回值
WF4.0 基礎篇 (二十四) Async ActivityAsync Activity

例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("寫入檔案完成");

}

}

流程
WF4.0 基礎篇 (二十四) Async ActivityAsync Activity
宿主 WorkflowInvoker.Invoke(new myAsyncWriteFileWorkflow());
結果
WF4.0 基礎篇 (二十四) Async ActivityAsync Activity

例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 "寫入成功";

}

}

流程
WF4.0 基礎篇 (二十四) Async ActivityAsync Activity
宿主 WorkflowInvoker.Invoke(new myAsyncWriteFileByResultWorkflow());
結果
WF4.0 基礎篇 (二十四) Async ActivityAsync Activity