首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF4.0 基礎篇(24):AsyncCodeActivity 以同步方式等待非同步操作完成

     編輯:關於.NET

AsyncCodeActivity 名稱易誤解:它並非讓活動「非同步執行」,而是提供同步等待非同步操作 (APM 模式 Begin/End) 完成的機制,將並行操作轉為流程視角的串行等待。建議先閱讀「InvokeMethod 調用方法」篇建立基礎概念。

兩大核心類別

類別繼承回傳值支援關鍵抽象方法
AsyncCodeActivityActivity無BeginExecute、EndExecute
AsyncCodeActivity<TResult>Activity<TResult>有 (EndExecute 回傳)BeginExecute、EndExecute

兩者皆覆寫 CacheMetadata,密封類別。

AsyncCodeActivity 結構

範例 1:AsyncCodeActivity - 非同步寫入檔案

活動實作:使用 FileStream.BeginWrite/EndWrite

protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
    var fn = context.GetValue(FileName);
    var fd = context.GetValue(FileData);
    Console.WriteLine("開始寫入檔案");
    var fs = File.Open(fn, FileMode.Create);
    context.UserState = fs;  // 跨階段傳遞狀態
    var bytes = Encoding.Unicode.GetBytes(fd);
    return fs.BeginWrite(bytes, 0, bytes.Length, callback, state);
}

protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
    Thread.Sleep(5000);  // 模擬額外處理
    var fs = (FileStream)context.UserState;
    fs.EndWrite(result);
    fs.Flush(); fs.Close();
    Console.WriteLine("寫入檔案完成");
}

流程與結果:流程設計 執行結果

範例 2:AsyncCodeActivity<TResult> - 帶回傳值版本

protected override string EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
    Thread.Sleep(5000);
    var fs = (FileStream)context.UserState;
    fs.EndWrite(result);
    fs.Flush(); fs.Close();
    Console.WriteLine("寫入檔案完成");
    return "寫入成功";  // 回傳值自動繫結至 Result
}

流程與結果:流程設計 執行結果

完整範例代碼:下載連結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved