基於微軟並行計算的工作流程解決方案 (2) Tasked based Parallel Activity

來源:互聯網
上載者:User

上一節我們做了個簡單的測試證明了Parallel並不是真正意義上的並行工作流程,並且分析了它的缺陷。

在.net framework 4裡面有很多關於並行計算的組件,現在我們就要利用微軟TPL(The Task Parallel Library)中的System.Threading.Tasks.Task類型來實現並行的分支。要定製非同步工作流程活動,我們的新類必須繼承於.net WF中的基類AsyncCodeActivity

我們重寫一下PartDBReplicationActivity,

public class PartDBReplicationAsyncActivity : AsyncCodeActivity
{
        public InOutArgument<Order> OrderInActivity { get; set; }

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            Order order = context.GetValue(OrderInActivity);
            Task worker = Task.Factory.StartNew(
                (o) =>
                {
                    order.Status = OrderStatus.InProcess;
                    //Call Part service
                    Thread.Sleep(5000);
                }, state);
            worker.ContinueWith(task => callback(task));
            return worker;
        }

        protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
           
        }
}

再看新的VehicleReplicationAsyncActivity 

public class VehicleReplicationAsyncActivity : AsyncCodeActivity
 {
        public InOutArgument<Order> OrderInActivity { get; set; }

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            //Console.WriteLine("VehicleDBReplication AsyncActivity starts at:{0} \r\n", DateTime.Now.ToString());
            Order order = context.GetValue(OrderInActivity);
            Task worker = Task.Factory.StartNew(
                (o) =>
                {                  
                    order.Status = OrderStatus.InProcess;
                    //Call Part service
                    Thread.Sleep(5000);
                    //Console.WriteLine("VehicleDBReplication AsyncActivity ends at {0}.\r\n", DateTime.Now.ToString());
                }, state);
            worker.ContinueWith(task => callback(task));
            return worker;
        }

        protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {

        }
 }

我們修改main裡面的代碼讓它執行新的Close Order流程

class Program
{
static void Main(string[] args)
{
DateTime dtStart = DateTime.Now;
Console.WriteLine("CloseOrder workflow starts at:{0}", dtStart);
Console.WriteLine("--------------------------------------------------------------");
//WorkflowInvoker.Invoke(new CloseOrderWorkflow());
WorkflowInvoker.Invoke(new CloseOrderParallelWorkflow());
Console.WriteLine("--------------------------------------------------------------");
DateTime dtEnd = DateTime.Now;
Console.WriteLine("CloseOrder workflow ends at:{0}", dtEnd.ToString());
Console.WriteLine("Total time elapsed in seconds :{0}",( dtEnd - dtStart).Seconds.ToString());
Console.Read();
}
}

看結果

現在整個流程只花了5秒鐘,我們初步完成基於微軟並行解決方案的並行工作流程。

至此我們實現的並發工作流程要求分支之間安全執行緒,業務上沒有耦合和次序關係。

我們實現的基於並行計算並發工作流程活動也存在一些缺陷:可擴充性不高,開發人員過於底層細節的關注,封裝性不好等等..

後面的任務是要完成一個真正意義上的可擴充的並發Parallel Activity,使用者只要拖拽這個工作流程活動到Visual Studio裡面,設定一些參數,比如綁定處理的真正任務,那麼就無需和Parallel.Task底層對象打交道,只需要對商務邏輯的實現。 

範例程式碼:

http://files.cnblogs.com/huyq2002/ParallelTask.zip

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.