例子下載下傳:
http://files.cnblogs.com/foundation/AsyncCodeActivitySample.rar
項目說明:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxADNGd1X3MDOw8FMxAjMzAzLc52bpRXYk5WdvZ2Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
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()); |
結果 | |