13 1 4 建立工作流基本操作

2021-07-26 00:11:39 字數 2040 閱讀 1115

13.1.4 建立工作流基本操作

f# 功能包(powerpack)提供了許多重要 i/o 操作的非同步版本,但是不全,為此,f# 庫提供了構建自己的工作流基本操作的方法。如果操作在工作流中執行,使用的標準 .net 模式,提供 beginoperation 和 endoperation 方法,可以使用 async.frombeginend 方法,把這兩個方法作為引數,就會返回非同步工作流。

能夠執行而不會阻塞執行緒的其他操作也可以。例如,我們可能要等待乙個特定事件發生,當它觸發時,繼續執行工作流。清單 13.4 建立乙個基本操作,使用計時器,等待一定的時間(毫秒數),然後啟動工作流。

清單 13.4 執行非同步等待 (f# interacitve)

module myasync =

let sleep(time) = [1] <– 暫停工作流一定的時間

async.fromcontinuations(fun (cont, econt, ccont) –>

let tmr = new system.timers.timer(time, autoreset = false)

tmr.elapsed.add(fun _ -> cont()) [2] <– 啟動計算

tmr.start()

);;

(…)async.runsynchronously(async );;

starting…

finished!

val it : unit = ()

f# 庫中已經有同樣的功能了,由 async.sleep 實現,在本章後面我們會用到它,因此,這僅是乙個示例而已;如果使用同步版本 thread.sleep,就會阻塞工作流,這是乙個重要區別。在我們的函式建立計時器,把執行緒返回到 .net 執行緒池期間,這個方法會一直阻塞執行緒。而使用我們的基本操作時,.net 執行時可以並行執行工作流,而不受任何限制。

sleep 函式[1],其引數為想要延遲處理的毫秒數,使用 async.fromcontinuations 方法構建工作流。這個方法非常接近地反映了工作流的內部結構。引數值是 lambda 函式,在工作流啟動時執行。lambda 的引數為有三個連續的元組,第乙個函式在操作成功完成時呼叫,第二個連續在操作觸發異常時呼叫,類似於前面補充材料中宣告的 async<』t> 型別,第三個連續在取消工作流時觸發。在 lambda 函式體中,我們建立乙個計時器,指定 elapsed 事件的處理程式,這個處理程式只執行成功連續[2]。

清單 13.4 表明,建立了自己的基本操作以後,使用它的**非常簡單。因為返回 unit 值,我們用 do! 基本操作,而不是 let! [3]。當**執行時,它構造了有處理程式的計時器,然後啟動;當指定的時間過去,系統從執行緒池取得乙個可用的執行緒,執行事件處理程式,依次執行計算的其餘部分(在本示例,輸出到螢幕)。

c# 中的非同步工作流

簡化 c# 中的非同步程式設計,已經有過無數的嘗試,但是,仍沒有能夠像非同步工作流語法一樣完美的庫。從終端使用者的角度來看(只是把**包裝在 async 塊中),f# 語法是非常簡單的,而這在 c# 中是很難實現的。

我們已經看到過,linq 查詢大體相當於 f# 的計算表示式,所以,你可能會忍不住要實現 select 和 selectmany 操作。理論上,使用查詢表示式,寫出非同步操作是有可能的,但是,能夠在查詢內部使用的語法,是有限制的。值得關注的是,c# 迭代器也可以用於此目的。《在 c# 中使用迭代器的非同步程式設計》一文對這種方法有敘述(在 使用這種技術最實用的庫是 jeffrey richter 的 powerthreading 庫 [richter,2023年]。

基於 c# 迭代器、最複雜的乙個庫,是併發性和協調執行庫(ccr)[chrysanthakopoulos 和 singh,2023年]。這個庫是為微軟機械人工作室(microsoft robotics studio)而開發的一部分,在這裡,響應性和非同步處理能力,對任何應用程式都是至關重要的。可以在 jeffery richter 的文章《併發事務》中找到有關這個庫的詳細內容[richter,2023年]。

現在,可以開始把非同步工作流用於更具體的目的了。在下一節,我們將會看到由世界銀行所提供的資料服務,討論如何使用非同步工作流來呼叫。

13 1 4 建立基元工作流

13.1.4 建立基元工作流 f powerpack 庫包含許多重要的 i o 操作非同步版本,但是,它可不能包括所有。為此,f 庫還提供了構建自己的基元工作流的方法。如果要執行在工作流內部的操作,使用的標準 net 模式,並提供了 beginoperation 和 endoperation 方法,...

如何建立工作流專案

遵循以下步驟用 visual studio for windows workflow foundation 建立乙個工作流專案。啟動 visual studio 2008。在 檔案 選單上指向 新建 然後選擇 專案 此時將開啟 新建專案 對話方塊。在 專案型別 窗格中,選擇 visual c 專案或...

Activiti工作流 一 之基本操作介紹

工作流的概念 工作流 workflow 就是 業務過程的部分或整體在計算機應用環境下的自動化 它主要解決的是 使在多個參與者之間按照某種預定義的規則傳遞文件 資訊或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現 通俗的說,流程就是多個人在一起合作完成某件事情的步驟,把步驟變成計...