活動的條件有兩種:**條件和宣告性規則條件。如果我們改變了**條件我們需要重新編譯我們的工作流程式才可以。由於宣告行規則條件是序列化到.rules檔案中的,所以我們可以動態的更新,下面舉例說明:
我們建立乙個順序型工作流控制台程式,工作流設計如下圖:
然後分別設定分支條件(均為宣告性規則條件)如下:
ifelsebranchactivity1:條件名--ifbranch1,表示式--this.conditonnum == 1。
ifelsebranchactivity2:條件名--ifbranch2,表示式--this.conditonnum == 2。
工作流**如下:
using system;using system.componentmodel;
using system.componentmodel.design;
using system.collections;
using system.drawing;
using system.linq;
using system.workflow.componentmodel.compiler;
using system.workflow.componentmodel.serialization;
using system.workflow.componentmodel;
using system.workflow.componentmodel.design;
using system.workflow.runtime;
using system.workflow.activities;
using system.workflow.activities.rules;
namespace caryupdatecondition
public int conditonnum
private void codeactivity1_executecode(object sender, eventargs e)
private void codeactivity2_executecode(object sender, eventargs e)
private void codeactivity3_executecode(object sender, eventargs e)}}
我們設計宿主程式如下:
static void main(string args)如果這個時候我們執行工作流,和我們以前的沒什麼區別,程式會執行codeactivity1和codeactivity2,我們現在要在執行時動態更改活動的條件,什麼時候做更新我們在wf中的動態更新 一文有詳細的說明。我們註冊workflowruntime的created事件。在該事件中做更改。**如下:; workflowruntime.workflowterminated += delegate(object sender, workflowterminatedeventargs e)
;workflowruntime.workflowcreated += new
eventhandler
(workflowruntime_workflowcreated);
console.writeline("--第乙個工作流執行開始--");
dictionary
argnum= new
dictionary
();argnum.add("conditonnum", 1);
workflowinstance instance = workflowruntime.createworkflow(typeof
(caryupdatecondition.conditonworkflow),argnum);
instance.start();
waithandle.waitone();
console.writeline("--第乙個工作流執行結束--");
console.writeline();
console.writeline("--第二個工作流執行開始--");
dictionary
argnum2 = new
dictionary
();argnum2.add("conditonnum", 2);
workflowinstance instance2 = workflowruntime.createworkflow(typeof
(caryupdatecondition.conditonworkflow), argnum2);
instance2.start();
waithandle.waitone();
console.writeline("--第二個工作流執行結束--");}}
private staticboolean firstwf = true;
private static void modifyrules(workfloweventargs e)
",ex.message);}}
else}}
}firstwf = false;
}
現在我們再次執行程式,由於我們在上面的程式中將ifelsebranchactivity1的條件this.conditonnum == 1。右面的表示式改為了0,結果如下:
我們在上面的程式中在執行時對ifelsebranchactivity1的條件做了更改,從結果中也看到更改生效,我們還可以在執行時替換整個.rules檔案,這樣我們就可以在外部集中管理工作流的規則條件,我們現在將原來的自動生成的.rules
檔案拷貝乙份,重名為replacerules.rules,然後把該檔案中以下部分做更改,同樣是將ifelsebranchactivity1
的條件this.conditonnum == 1,右面的表示式改為了0:
<ns0:codebinaryoperatorexpression.right
>
<
ns0:codeprimitiveexpression
>
<
ns0:codeprimitiveexpression.value
>
<
ns1:int32
xmlns:ns1
="clr-namespace:system;assembly=mscorlib, version=2.0.0.0,
culture=neutral, publickeytoken=b77a5c561934e089">0
ns1:int32
>
ns0:codeprimitiveexpression.value
>
ns0:codeprimitiveexpression
>
ns0:codebinaryoperatorexpression.right
>
實際中我們不會這樣做,我們會通過規則編輯器來設定我們的規則,我們在執行時替換該規則檔案,程式如下:
private static void replacerules(workfloweventargs e)執行程式後我們會得到和上面同樣的結果。",ex.message);}}
else
}
}
}firstwf = false;
}
entity framework 動態條件
entity framework 動態條件 問題 在實際編碼過程中,根據不同的選擇情況,會需要按照不同的條件查詢資料集 如 狀態confirmstatus 如果為空的時候,查詢全部,如果有具體值的時候,查詢相應的值 同時還有其他條件,外來鍵編號 task 等等。這個時候,需要根據條件的值來判斷是否增...
動態規劃 活動選擇問題
乙個遞迴解 設c i j 為sij中最大相容子集中的活動數目,當sij為空集時,c i j 0 當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c i j c i k c k j 1。當i j時,sij必定為空集,否則sij則需要根據上面提...
動態規劃 活動選擇問題
乙個遞迴解 設c i j 為sij中最大相容子集中的活動數目,當sij為空集時,c i j 0 當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c i j c i k c k j 1。當i j時,sij必定為空集,否則sij則需要根據上面提...