2012-02-29 5 views
-1

私はMicrosoft wfサンプルプロジェクトで作業しています:WF_WCF_Samples \ WF \ Application \ VisualWorkflowTracking \ CS このサンプルプロジェクトはwf4シミュレーションを実行します。ワークフローは正しく実行されませんが例外はスローされません

ワークフローに入力bool引数があります。

現在、私には2つの問題があります。

まず問題:

私は、引数(ワークフローデザイナー)に値を入力すると、コードが実行されるときに、私はすべての例外を得ることはありませんが、シミュレーションが実行されません。

コードを修正し、引数のコレクションを取得しようとしました。私はその後、辞書に追加してからInvokeメソッドに渡します。この方法ではエラーは発生しませんが、プロセスは起動しません。私は議論の価値が辞書に正しく渡されていないと思います。以下はコードです

ThreadPool.QueueUserWorkItem(new WaitCallback((context) => 
{ 

    bool noArguments = false; 

    var serviceManager = this.WorkflowDesigner.Context.Services; 

    Dictionary<string, object> retval = new Dictionary<string, object>(); 
    var modelService = serviceManager.GetService<ModelService>(); 
    var rootModelItem = modelService.Root; 

    var properties = rootModelItem.Properties["Properties"]; 
    if (properties == null) noArguments = true; 

    var propertiesCollection = properties.Collection; 
    if (propertiesCollection == null) noArguments = true; 
    if (propertiesCollection.Count == 0) noArguments = true; 

    foreach (var p in propertiesCollection) 
    { 
     var d = p.GetCurrentValue() as DynamicActivityProperty; 
     if (d != null) 
     { 
      var name = d.Name; 
      dynamic inArgument = d.Value; 

      try 
      { 
       var val = inArgument.Expression.Value; 
       retval.Add(name, val); 
      } 
      catch (Exception er) 
      { 
       MessageBox.Show("Variable: " + d.Name + " Value is Empty", "Variable Error",MessageBoxButton.OK,MessageBoxImage.Error); 
      } 
     } 

    } 

    //Invoking the Workflow Instance with Input Arguments 
    if (noArguments) 
    { 
     instance.Invoke(); 
    } 
    else 
    { 
     //this line below does raise any error but it does not run the process. 
     //instance.Invoke(retval, new TimeSpan(1, 0, 0)); 

//this line below works as long as in the workflow designer the argument value is left blank 
     instance.Invoke(new Dictionary<string, object> { { "decisionVar", "hello" } }, new TimeSpan(1, 0, 0)); 
    } 


    //This is to remove the final debug adornment 
    this.Dispatcher.Invoke(DispatcherPriority.Render 
     , (Action)(() => 
    { 
     this.WorkflowDesigner.DebugManagerView.CurrentLocation = new SourceLocation(this.WorkFlowFile,1,1,1,10); 
     //this.WorkflowDesigner.DebugManagerView.CurrentLocation = new SourceLocation("Workflow.xaml",1,1,1,10); 
    })); 

})); 

答えて

1

これは、例外がスローされ、作業を行っているスレッドが終了している可能性があります。 try/catchブロックですべてを囲み、例外を記録することができます。

+0

こんにちはRon、私の質問にコメントする時間を割いてくれてありがとう。 – user1239078

+0

こんにちはRon、私の質問にコメントする時間を割いてくれてありがとう。 WCFとWFにMSサンプルをダウンロードしました。 WF_WCF_Samples \ WF \ Application \ VisualWorkflowTracking \ CS VisualWorkflowTracking.slnプロジェクトを開きます.F5を実行し、デバッグ中にアプリケーションで「ファイル」をクリックし、「ワークフローを実行」をクリックします。さて、これを試してください:デバッグを停止し、デザインモードでワークフローを開き、 "desicionVar"という引数があります。 「デフォルト値」に値を入力します。真または偽のいずれか。再度実行すると、シミュレーションが実行されないことがわかります – user1239078

+0

サンプルコードでは、 "WorkflowDesignerHost.xaml.cs"ファイルに、ハードコードされた値をデフォルト値に渡す行があります。 行は次のとおりです。 instance.Invoke(new Dictionary {{" decisionVar "、true}}、新しいTimeSpan(1、0、0)); ワークフローデザイナーのdecisionVar引数に「デフォルト値」を入力した後にシミュレーションが実行されない理由を理解できませんか? コンパイル中でも実行中にもエラーが表示されません これは私の質問を明確にしたいと考えています。私がここで説明した内容を複製できるかどうか教えてください。 – user1239078

関連する問題