上一節我們做了個簡單的測試證明了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