2013-10-29 43 views
1

我有一個WF(4.5)工作流活動創建一個子工作流(評估VisualBasicValue表達式)。我需要結果之前我完成父級工作流程。如何安排孩子活動在父母完成之前執行*?

我的表達式添加到元數據是這樣的:

private VisualBasicValue<string> _expression; 

protected override void CacheMetadata(NativeActivityMetadata metadata) 
{ 
    base.CacheMetadata(metadata); 
    var visualBasicValue = (VisualBasicValue<string>)(_childActivity.Text.Expression); 
    var expressionText = visualBasicValue.ExpressionText; 
    _expression = new VisualBasicValue<string>(expressionText); 
    metadata.AddChild(_expression); 
} 

我試圖調度活動在Execute方法是這樣的:

protected override void Execute(NativeActivityContext context) 
{ 
    context.ScheduleActivity(context, _expression, OnCompleted); 
    Result.Set(context, _value); 
} 

隨着回調:

private void OnCompleted(NativeActivityContext context, ActivityInstance completedInstance, string result) 
{ 
    _value = result; 
} 

不幸的是,_表達活動僅在之後執行父級的執行方法返回。將它作爲實現子代添加不起作用(它不能用作實現子代,因爲它應該計算包含父代外部變量的表達式)。

任何想法如何克服這一點,並在執行環境內執行?

回答

0

花了我幾天,但我設法解決了我自己的問題(沒有打破WF的工作原理)。

我最終什麼事做的是,使用反射,遍歷孩子的屬性和創建評估的表達式的LinkedList(使用VisualBasicValue)每個參數,在CacheMetadata方法。然後在執行階段,我安排了第一次評估的執行。在其回調函數中,我遍歷剩下的評估,安排下一次評估的執行,將結果添加到字典中,直到完成。

最後,如果沒有更多的評估計劃,我會安排一個最終活動,它將字典作爲它的參數,並且可以隨心所欲地做任何事情。在自己的上,它可以選擇將最終結果返回到容器的OutArgument。

我之前無法理解的是,即使調度發生在實例化活動執行後,調用也會在控制返回主機工作流應用程序之前運行,並且在該空間中我可以工作。

1

在代碼中,就像在現實生活中一樣,你不能安排某些東西到過去(然而:)。

ScheduleActivity()會將活動放置在執行隊列中並儘快執行。由於父級活動仍在運行,所以_ 表達式將僅在它之後執行。底線,這是一個異步調用。

如果要控制何時_ 表達被調用時,只需使用WorkflowInvoker來執行它,同步,只要你想。

public class MyNativeActivity : NativeActivity 
{ 
    private readonly VisualBasicValue<string> _expression; 

    public MyNativeActivity() 
    { 
     // 'expression' construction logic goes here 
     _expression = new VisualBasicValue<string>("\"Hi!\""); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     var _value = WorkflowInvoker.Invoke(_expression); 

     Console.WriteLine("Value returned by '_expression': " + _value); 

     // use '_value' for something else... 
    } 
} 
+0

我錯過了你的最後一段。顯然,如果你需要在上下文中執行它,這將不起作用。我不記得另一個好的解決方案。當我沒有你的背景時,總是很難說這一點,但我的猜測是你應該退後一步。如果你最終在這裏,那麼實現本質上是錯誤的。 – Joao

+0

我試圖解決的問題是我需要採取兒童活動,而不是執行它,我需要解析它(包括評估孩子的屬性),並運行另一個過程。例如,不是運行編譯器活動(在TFS中),而是運行具有相同屬性的另一個編譯器。 –

+1

爲什麼你不把邏輯從「孩子活動」中放到一個單獨的活動中,只要你需要評估表達式就可以調用它。再說一次,似乎你採取了錯誤的做法,而不是從一開始就修復它,你試圖補救一些不可能的事情。 – Joao