workflow foundation 使用跟蹤服務的問題。


大家好,我寫WWF時遇到下面這個問題,請教下CSDN上的朋友們.

我做的是個順序工作流的例子。就簡單的一個code輸出一行提示文字。
現在在控制台應用程序中加載這個工作流時,代碼如下:
        static void Main(string[] args)
        {
            //WorkflowRuntime workflowRuntime = new WorkflowRuntime();
            string connectionString = "Initial Catalog=TrackingStore;Data Source=chenxiuping\\SQLEXPRESS;Integrated Security=SSPI;";
            WorkflowRuntime workflowRuntime = new WorkflowRuntime();
            System.Workflow.Runtime.Tracking.SqlTrackingService sqlTrackingService = new System.Workflow.Runtime.Tracking.SqlTrackingService(connectionString);
             workflowRuntime.AddService(sqlTrackingService);
            AutoResetEvent waitHandle = new AutoResetEvent(false);
            workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
            workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
            {
                Console.WriteLine(e.Exception.Message);
                waitHandle.Set();
            };
            workflowRuntime.Started += new EventHandler<WorkflowRuntimeEventArgs>(workflowRuntime_Started);
            workflowRuntime.Stopped += new EventHandler<WorkflowRuntimeEventArgs>(workflowRuntime_Stopped);
            workflowRuntime.WorkflowResumed += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowResumed);
            workflowRuntime.WorkflowSuspended += new EventHandler<WorkflowSuspendedEventArgs>(workflowRuntime_WorkflowSuspended);
            
            WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HostingWorkflowRuntime.SimpleWorkflow));
            instance.Start();                
            instance.Suspend("暫停提示信息。");//暫停進程
            instance.Resume();//繼續進程

             waitHandle.WaitOne();                       
            Console.WriteLine("Workflow Completed - press ENTER to continue");
            Console.Read();
        }
==================
現在問題是,添加了這句 workflowRuntime.AddService(sqlTrackingService); 工作流走到倒數第四行的waitHandle.WaitOne(); 就不走了。無法完成這個應用程序。若是注釋了這行,不使用這個服務,則可以完成這個應用程序。
想請教大家,這個是怎么回事,該如何修改。
給我個修改的方向也好。謝謝大家了。

我是希望這個跟蹤服務能記錄我的工作流所做的更改,記錄這個工作流已經執行到哪一步了。

18 个解决方案

#1


拜托大哥大姐們……不回答我的問題也別把帖子踩底下去啊。

#2


確定你的連接字符串是否有錯誤。SQL表是否存在

#3


幫你頂一下啊

#4


:)

#5


我試過了。我故意把字符傳寫錯.那么這個工作流實例是無法生成的。 
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HostingWorkflowRuntime.SimpleWorkflow)); 
這行代碼是走不下去的。所以我確認這個連接數據庫的字符串是正確的。
至於其中的表。我是根據WWF自帶的腳本生成的。我開數據庫進去.表都在。也都可以打開。但是里頭都沒數據.

#6


謝謝三樓四樓的朋友幫頂.  :)

#7


  
    private static WorkflowRuntime _workflowRuntime = null;
    private static object _syncRoot = new object();
    private static KACreationServices kas = new KACreationServices();
    public static KACreationServices KAS
    {
        get { return kas; }
    }
static WorkFlowHosting()
    {
        lock (_syncRoot)
        {
            if (null == _workflowRuntime)
            {
                AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkFlowRuntime);
                AppDomain.CurrentDomain.DomainUnload +=  new EventHandler(StopWorkFlowRuntime);
                _workflowRuntime = new WorkflowRuntime();
                _workflowRuntime.WorkflowCreated += new EventHandler<WorkflowEventArgs>(_workflowRuntime_WorkflowCreated);
                _workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(_workflowRuntime_WorkflowCompleted);
                _workflowRuntime.ServicesExceptionNotHandled += new EventHandler<ServicesExceptionNotHandledEventArgs>(_workflowRuntime_ServicesExceptionNotHandled);
                _workflowRuntime.WorkflowAborted += new EventHandler<WorkflowEventArgs>(_workflowRuntime_WorkflowAborted);
                SqlTrackingService ts = new SqlTrackingService(KAConfiguration.ConnectionString);//跟蹤服務
                _workflowRuntime.AddService(ts);
                SqlWorkflowPersistenceService ps = new SqlWorkflowPersistenceService(KAConfiguration.ConnectionString, true,
  new TimeSpan(1, 0, 0), new TimeSpan(1, 0, 0)); //持久話服務              
                _workflowRuntime.AddService(ps);
                ExternalDataExchangeService kaserverices = new ExternalDataExchangeService();
                _workflowRuntime.AddService(kaserverices);
                kaserverices.AddService(kas);
                //_workflowRuntime.AddService(ss);
                SharedConnectionWorkflowCommitWorkBatchService sc = new SharedConnectionWorkflowCommitWorkBatchService(KAConfiguration.ConnectionString);//事務服務
                _workflowRuntime.AddService(sc);
                _workflowRuntime.StartRuntime();
              
            }
        }
    }

#8


上面是我剛寫的,測試過了,沒問題

#9


謝謝。我仔細閱讀下。 

#10


leijun1106  我剛才試了。還是不行。

我在_workflowRuntime_WorkflowAborted 中加了行提示信息。有輸出。。

說明我這個工作流引擎被中斷了不??


其中。我修改過你的代碼。把 KACreationServices 相關的刪除了。你這個是提供數據庫連接字符串的吧?
我是直接用一個變量了。 

下面是現在的代碼。整個Program.cs都貼出來。。
=============================================================================

#region Using directives

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Runtime.Tracking;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

#endregion

namespace DefaultSQLServices
{
    class Program
    {
        static string connectionString = "Initial Catalog=TrackingStore;" +
     "Data Source=CHENXIUPING\\SQLEXPRESS; Integrated Security=SSPI;";
    
        private static WorkflowRuntime _workflowRuntime = null; 
        private static object _syncRoot = new object(); 
      
        static void Main(string[] args)
        {
            lock (_syncRoot) 
            { 
                if (null == _workflowRuntime) 
                { 
                    _workflowRuntime = new WorkflowRuntime(); 
                    _workflowRuntime.WorkflowCreated +=new EventHandler<WorkflowEventArgs>(_workflowRuntime_WorkflowCreated); 
                    _workflowRuntime.WorkflowCompleted += new EventHandler <WorkflowCompletedEventArgs>(_workflowRuntime_WorkflowCompleted); 
                    _workflowRuntime.ServicesExceptionNotHandled +=new EventHandler<ServicesExceptionNotHandledEventArgs>(_workflowRuntime_ServicesExceptionNotHandled);
                    _workflowRuntime.WorkflowAborted += new EventHandler<WorkflowEventArgs>(_workflowRuntime_WorkflowAborted);
                    
                    SqlTrackingService ts = new SqlTrackingService(connectionString);//跟蹤服務 
                    _workflowRuntime.AddService(ts);

                    SqlWorkflowPersistenceService ps = new SqlWorkflowPersistenceService(connectionString, true, 
      new TimeSpan(1, 0, 0), new TimeSpan(1, 0, 0)); //持久話服務
                    _workflowRuntime.AddService(ps);

                    SharedConnectionWorkflowCommitWorkBatchService sc = new SharedConnectionWorkflowCommitWorkBatchService(connectionString);//事務服務 
                    _workflowRuntime.AddService(sc); 
                    _workflowRuntime.StartRuntime();
                    
                    AutoResetEvent waitHandle = new AutoResetEvent(false);
                    
                    WorkflowInstance instance = _workflowRuntime.CreateWorkflow(typeof(DefaultSQLServices.SimpleWorkflow));
                    instance.Start();

                    instance.Suspend("Reason we are suspending the workflow.");
                    instance.Resume();

                    waitHandle.WaitOne();// 還是走到這步不動了。

                    GetInstanceTrackingEvents(instance.InstanceId);

                    Console.WriteLine("Workflow Completed - press ENTER to continue");
                    Console.Read();
                   
                } 
            } 
        }

        static void _workflowRuntime_WorkflowAborted(object sender, WorkflowEventArgs e)
        {
            Console.WriteLine("Aborted!!!!");// 這個提示信息輸出了。
        }

        static void _workflowRuntime_ServicesExceptionNotHandled(object sender, ServicesExceptionNotHandledEventArgs e)
        {
            Console.WriteLine("--------********" + e.Exception.Message);
        }

        static void _workflowRuntime_WorkflowCreated(object sender, WorkflowEventArgs e)
        {
            Console.WriteLine("Created!!!!");
        }
        static void _workflowRuntime_WorkflowCompleted(object sender, WorkflowEventArgs e)
        {
            Console.WriteLine("_workflowRuntime_WorkflowCompleted  Completed!!!!");
        }
        static void GetInstanceTrackingEvents(Guid instanceId)
        {
            Console.WriteLine("\r\nInstance Tracking Events :");

            SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);
            SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
            sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance);

            try
            {
                foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents)
                {
                    Console.WriteLine("EventDescription : {0}  DateTime : {1}", workflowTrackingRecord.TrackingWorkflowEvent, workflowTrackingRecord.EventDateTime);
                }
            }
            catch (Exception)
            {
                Console.WriteLine("No Instance Tracking Events Found");
            }

        }
    }
}

#11


幫頂下,學習WF中。。。深度還不夠啊

#12


郁悶。試了N次了。

就是一個SqlTrackingService 不對。其他的兩個服務加了都可以正常執行完成。就這個一加上去就被異常中斷。輸出 Aborted的提示信息。

#13


只能夠學習一下

#14


剛還發現一個 SqlWorkflowPersistenceService 服務在工作流執行完成后,數據庫中查看不到數據,原來是因為這個持久化服務只在工作流運行中保存數據,比如在一個delay的時間內去查看數據庫就可以看見數據.
但是整個工作流執行完成后,系統自動刪除  instancestate表的數據,所以無法查到數據。

#15


別沉了。謝謝。

#16


別沉了。謝謝。我被這個問題煩了好久了。論壇的兄弟姐妹們,幫把手吧。

小妹在此謝謝大家了。 

#17


郁悶。沒人幫忙嗎?

#18


打開操作系統的服務,確保服務Distributed Transaction Coordinator是打開的。問題就會解決!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com