دوشنبه ۱۷ بهمن ۱۳۹۰
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 
 
 قسمت سوم آشنایی با Windows Workflow Fundamental
.NET
تاریخ ثبت:  ۸۸/۱۲/۲۶
تعداد نمایش:  ۱۶۹۵
  نویسنده: مهران شیخ الاسلامی
 
   ۱۰  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

قسمت سوم : میزبانی زمان اجرای گردش کار

(Hosting Workflow Runtime)

برای توضیح این قسمت از برنامه ای که در قسمت قبل ایجاد کردیم استفاده کرده ام. در قسمت قبل اولین برنامه را ایجاد و اجرا کردیم. حال به شرح کد درون فایل Program.cs که درپروژه قرار دارد میپردازم. کد اصلی که برای این فایل ایجاد شده را در زیر میبینید:

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

using System.Workflow.Runtime;

using System.Workflow.Runtime.Hosting;

 

namespace HelloWorldWF

{

    class Program

    {

        static void Main(string[] args)

        {

  using(WorkflowRuntime workflowRuntime = new

WorkflowRuntime())

            {

                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();

                };

                WorkflowInstance instance =

workflowRuntime.CreateWorkflow(

typeof(HelloWorldWF.Workflow1));

                instance.Start(); 

                waitHandle.WaitOne();

            }

        }

    }

}

 

هدف از این کد میزبانی زمان اجرای گردش کار و اجرای گردش کار تعریف شده (مانند آنچه در قسمت قبل ساختیم) است. این کد با انتخاب نوع گردش کار در زمان ایجاد پروژه ایجاد میشود.

کد با ایجاد یک نمونه از کلاس WorkflowRuntime شروع میشود. همانطور که از اسم آن پیداست، این مهمترین کلاس برای اجرای گردش کار است. این کلاس همچنین رویدادها و توابعی را فراهم میکند که به شما اجازه نظارت و کنترل اجرای گردش کار را میدهد.

سپس یک نمونه از کلاس AutoResetEvent ایجاد میشود. این یک کلاس همزمانی نخ (Thread synchronization) است که برای آزاد کردن یک نخ منتظر به کار میرود. زمانی که یک گردش کار اجرا میشود، آنرا در یک نخ جدا از نخی که در آن توسط زمان اجرای گردش کار (Workflow Runtime) ایجاد و مدیریت میشود، اجرا میکند. این کار امکان اداره چندین گردش کار را در یک زمان میدهد. در این مثال، دو نخی که باید همزمان شوند نخ گردش کار و نخ اصلی برنامه میزبان (همان console application) هستند.

برای اینکه برنامه میزبان بداند چه موقع گردش کار کامل شده، کد دو رویداد از کلاس WorkflowRuntime را ثبت (Subscribe) میکند : WorkflowCompleted و WorkflowTerminated. برای پیاده سازی این عمل از دستورات delegate بدون نام در Net 2.0. استفاده شده است که اداره کننده رویداد را به جای ارجاع به یک تابع دیگر به صورت درونی پیاده کرده است.

وقتی یک گردش کار کامل میشود، رویداد WorkflowCompleted بر انگیخته (raise) میشود و این کد اجرا میگردد:

waitHandle.Set();

این به شیء  AutoResetEvent علامت میدهد که برنامه کنسول را از حالت منتظر خارج میکند. اگر خطایی رخ دهد، رویداد WorkflowTerminated برانگیخته شده و کد زیر اجرا میشود:

Console.WriteLine(e.Exception.Message);

waitHandle.Set();

این کد پیغام خطا را نشان داده و سپس نخ منتظر را رها میکند. رویدادهای دیگری نیز برای مشاهده وضعیت گردش کار وجود دارد، که در این مثال دو تا از آنها استفاده شده است.

وقتی که زمان اجرای گردش کار یا همان Workflow Runtime آماده شد، یک نمونه از گردش کار با این کدها ایجاد و اجرا میشود:

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HelloWorldWF.Workflow1));

instance.Start();

تابع CreateWorkflow چندین سربار دارد، ولی در این مدل فقط نوع گردش کار را به عنوان پارامتر ورودی دریافت میکند. وقتی گردش کار ایجاد شد، فورا شروع به اجرا نمیکند، در عوض یک شیء از WorkflowInstance برگردانده میشود و از آن برای اجرای گردش کار استفاده میشود.

در آخر برنامه کنسول اجرای نخ فعلی را معلق (suspend) میکند و منتظر میماند تا AutoResetEvent توسط این کد علامت داده شود:

waitHandle.WaitOne();

 

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
مهران شیخ الاسلامی
همه مقاله های نوشته شده توسط این کاربر (۴)
 
  پیام جدید
هیچ سؤال یا نظری برای این موضوع فرستاده نشده است.

 عنوان فرستنده تاریخ

Copyright © 2006 - 2012 All Rights Reserved.
Please direct your questions or comments to