سبد (0)

اجرای غیرهمزمان Workflow

اجرای یک Workflow بصورت غیرهمزمان یا asynchronously

در آموزش های قبلی، یادگرفتیم که چگونه یک نمونه Workflow را با استفاده از متد ()Invoke در یک Thread یکسان با برنامه Main اجرا نماییم. اجرای همزمان Workflow و برنامه Main در یک Thread یکسان، کار آسانی بود...!

اما در اکثر برنامه های کاربردی، یک Workflow باید در یک Thread مستقل اجرا شود. در اینجا قصد داریم نحوه ی استفاده از WorkflowApplication را برای اجرای یک Workflow توضیح دهیم.


مراحل انجام کار

 پروژه گردش کار UseWorkflowApplication شامل 5 مرحله زیر است:

  1. اضافه کردن یک پروژه از نوع Workflow Console Application
  2. طراحی گردش کار
  3. نوشتن کدهای #C
  4. اجرای Workflow
  5. پروژه گردش کار UseWorkflowApplication چگونه کار می کند؟

1 اضافه کردن یک پروژه جدید از نوع Workflow Console Application

در پنل Solution Explorer مطابق شکل زیر روی Solution Chapter01 راست کلیک کرده و از گزینه ADD زیر منوی New Project را انتخاب نمایید:

در پنجره Add New Project گزینه workflow را انتخاب کرده و سپس از سمت راست پنجره گزینه Workflow Console Application را انتخاب نمایید. حالا قسمت Name را با مقدار UseWorkflowApplication تنظیم نمایید و نهایتاً روی دکمه OK کلیک کنید.


2 طراحی گردش کار

از پنل Solution Explorerr فایل Workflow1.xaml را باز کنید و Workflow را مطابق زیر طراحی نمایید:

  1. از پایین صفحه، تب Arguments را انتخاب نمایید.
  2. حالا مطابق شکل زیر دو آرگومان Number1 و Number2 از نوع Int32 و از نوع ورودی (In) و آرگومان Result از نوع Int32 و از نوع خروجی (Out) را تعریف نمایید.
  3. از پنل ToolBox، اکتیویتی Assign را انتخاب کرده و به داخل صفحه طراحی بکشید. در ادامه باکس سمت چپ را با Result تنظیم نمایید و باکس سمت راست را با Numeber1 + Number2 مقدار دهی نمایید.


3 نوشتن کدهای #C

اما در ادامه فایل Program.cs را باز کنید و مطابق زیر کدها را تغییر دهید (قسمت قرمز رنگ):

فایل Program.cs

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.Threading;
using System.Collections.Generic;

namespace UseWorkflowApplication
{
    /// 
    /// Author : Amir Pahlavan sadegh
    /// provided to you by : http://www.beyamooz.com
    /// 
    class Program
    {
        static void Main(string[] args)
        {            
            AutoResetEvent syncEvent = new AutoResetEvent(false);
            IDictionary<string, object> input = new Dictionary<string, object>()
            {
                {"Number1",123},
                {"Number2",456}
            };
            IDictionary<string, object> output = null;
            WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), input);
            wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                Console.WriteLine("Workflow thread id:" + Thread.CurrentThread.ManagedThreadId);
                output = e.Outputs;
                syncEvent.Set();
            };
            wfApp.Run();
            syncEvent.WaitOne();
            Console.WriteLine(output["Result"].ToString());
            Console.WriteLine("Host thread id:" + Thread.CurrentThread.ManagedThreadId);

            Console.WriteLine("-------------\nProvided to you by : http://www.beyamooz.com \npress any key ...");
            Console.ReadLine();
        }
    }
}

4 اجرای Workflow

پروژه UseWorkflowApplication را بعنوان پروژه StartUp تنظیم نمایید و در ادامه برای اجرای Workflow دکمه های میانبر Ctrl+F5 را فشار دهید. با این کار Workflow ذخیره شده و بدون عملیات debugging نتیجه نشان داده خواهد شد. همان طور که می بینید، نتیجه در Console ویندوز اجرا می شود و اعدادی که انتظارش را داشتیم چاپ می شود:


5 پروژه گردش کار UseWorkflowApplication  چگونه کار می کند؟

وظیفه Workflow بالا این است که دو آرگومان ورودی Number1 و Number2 را با هم جمع می کند و نتیجه را به آرگومان Result که از نوع خروجی است Assign می کند.

از آنجایی که Thread مربوط به Workflow بطور همزمان با Thread صدا زننده (caller) اجرا می شود، Thread صدا زننده ممکن است قبل از  Thread مربوط به Workflow پایان یابد. بنابراین برای جلوگیری از خروج از برنامه مجبوریم از رویداد AutoResetEvent استفاده نماییم و به این ترتیب، Thread مربوط به Workflow و صدا زننده (caller) همزمان خواهند شد:

فایل Program.cs

AutoResetEvent syncEvent = new AutoResetEvent(false);

در کد زیر، تابع ()WaitOne باعث می شود تا Thread صدا زننده (caller) منتظر شود تا عملیات syncEvent تنظیم شود:

فایل Program.cs

syncEvent.WaitOne();

 در کد زیر، زمانی که اجرای Workflow کامل شد، متد syncEvent.Set واکشی می شود. بعد از آن اجرای Thread صدا زننده (caller) می تواند ادامه یابد تا اینکه بصورت کامل اجرا شود:

فایل Program.cs

wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                Console.WriteLine("Workflow thread id:" + Thread.CurrentThread.ManagedThreadId);
                output = e.Outputs;
                syncEvent.Set();
            };

 چیز دیگری که باید به آن توجه کنیم، نحوه ی گرفتن نتیجه Workflow بعد از اجرای کامل آن است. برخلاف متد WorkflowInvoker.Invoker در WorkflowApplication خصوصیتی به نام WorkflowApplicationCompletedEventArgs وجود دارد که بوسیله آن می توان خروجی Workflow را در غالب یک داده dictionary دریافت نمود.

{module خرید و دانلود فصل اول آموزش Workflow}

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه