程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF4.0 基礎篇(二十四) Async Activity

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

編輯:關於.NET

項目說明:

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> fileDate
{
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> fileDate
{
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());

結果

本文示例代碼:http://www.bianceng.net/dotnet/201208/240.htm

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved