13 1 4 建立基元工作流

2021-06-02 00:11:20 字數 2032 閱讀 3221

13.1.4 建立基元工作流

f# powerpack 庫包含許多重要的 i/o 操作非同步版本,但是,它可不能包括所有。為此,f# 庫還提供了構建自己的基元工作流的方法。如果要執行在工作流內部的操作,使用的標準 .net 模式,並提供了 beginoperation 和 endoperation 方法,可以使用 async.frombeginend 方法。如果你把這兩種方法給它作為引數值,它會返回乙個非同步工作流。

可以無需阻塞執行緒而執行的其他操作是可用的。例如,我們可能要等待乙個特定的事件發生,當它觸發時,繼續執行這個工作流。清單 13.4 建立了乙個基元,使用計時器,等待指定的毫秒數,然後繼續工作流。

listing 13.4 implementing asynchronous waiting (f# interacitve)

> module myasync =

let sleep(time) =

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

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

tmr.elapsed.add(fun _ -> cont())

tmr.start()

);;(...)

> async.runsynchronously(async );;

starting...

finished!

val it : unit = ()

相同的功能,已經在 f# 庫中可用了,所以,它並不只是乙個玩具的例子。它由 async.sleep 實現,我們將在本章後面需要使用它。當然,我們可能阻塞該工作流,使用同步版本,thread.sleep,但有乙個重要的區別。這個方法會阻塞執行緒,而我們的函式建立乙個計時器,並返回該執行緒到 .net 執行緒池。這意味著,當我們在使用自己的基元,.net 執行時可以並行執行工作流,而不受任何限制。

sleep 函式取我們想要延遲處理的毫秒數,使用 async.fromcontinuations 方法來構建工作流。此方法相當密切反映了工作流的內部結構。該引數值是 lambda 函式,將在工作流啟動時執行。lambda 取三個連續的元組作為引數值。第乙個函式應在操作成功完成時呼叫,第二個應在操作引發異常時呼叫。類似於 async<'t> 型別的宣告,來自早前的側邊欄,第三次連續,可以觸發取消工作流。在 lambda 體中,我們建立乙個計時器,指定 elapsed 事件的處理程式。這個處理程式只執行成功連續。

清單 13.4 顯示,建立了自己的基元後,用簡單的**段來使用它。因為它返回 unit 值,我們將用 do! 基元,而不是 let!。當這個**執行時,它構造了帶這個處理程式的計時器,然後啟動它。當指定的時間流逝,系統從執行緒池取乙個可用的執行緒,執行事件處理程式,依次執行計算的其餘部分(在本例中,列印到螢幕)。

在 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 方法,可以使用 ...

工作流建模 工作流概念

工作流建模 工作流概念 1 案例 工作流系統得基本目的是處理案例。每個案例都有乙個唯一標識,而且每個案例的生命週期都是有限的。案例生命週期都處於某個特定狀態,該狀態由三個元素組成 1 案例相關的屬性的值 案例屬性是一系列同案例相關的變數。能夠用來管理案例。正是通過這些變數,才有可能指出在特定條件下某...

工作流 一 什麼是工作流

什麼是工作流 工作流的英文全稱是 workflow,簡單理解則是業務流程的計算機化或自動化。它是是針對工作中具有固定程式的常規活動而提出的乙個概念,通過將工作活動分解定義良好的任務 角色 規則和過程來進行執行和監控,達到提高生產組織水平和工作效率的目的。工作流技術發端於70年代中期辦公自動化領域的研...