استفاده از Background Worker در #C

چهارشنبه 28 تیر 1396

در این مقاله قصد داریم نحوه استفاده از Background Worker که یک راه آسان برای استفاده از threading را در windows form ها برای ما فراهم میکند را با بیان مثالی به شما توضیح بدهیم.

استفاده از Background Worker در #C

شما دوست دارید که به کاربرتان یک progress bar زمانیکه برنامه شما در حال اجرا یک عملیات طولانی مانند بارگذاری تعداد زیادی از رکورد ها یا پردازش یک پرونده بزرگ مانند یک صفحه اکسل یا به روزرسانی برنامه دسکتاپ است ، نشان دهید؟

BackgrounderWorker برنامه شما را برای انجام یک عملیات ناهمزمان ، در حالی که شما می توانید یک نوار پیشرفت زیبا و همچنین گزارش وضعیت پیشرفت به کاربر خود نمایش دهید ، اماده میکند .

BackgrounderWorker یک روش رویداد محور (event-driven) برای انجام عملیات در یک موضوع جداگانه و اختصاصی است ، که اغلب زمانیکه شما نیاز دارید که به کاربر نشان دهید یک روند پیشرفت را زمانیکه عملیات شما در حال پردازش است مانند دانلود شدن فایل ها ، اتصال به پایگاه داده و دریافت نتایج و غیره  استفاده می شود .ایده BackgroundWorker از نام آن آمده است؛بعضی از عملیات ها را در پشت صحنه انجام می دهد و بقیه عملیات ها را به صورت موازی انجام می دهد.

توابع اصلی

BackgroundWorker  دارای 3 تابع اصلی می باشد:

1)DoWork

2)ProgressChanged

3)RunWorkerCompleted

رویداد DoWork به وسیله متدی به نام  RunWorkerAsync کنترل میشود . برای تنظیم یک عملیات پس زمینه ، یک event handler برای رویداد DoWork بیفزایید.عملیات زمان بر خود را در این رویداد انجام دهید و سپس RunWorkerAsync  را  برای اجرای عملیات خود فراخوانی کنید.

برای دریافت نوتیفیکیشن های بروزرسانی پیشرفت مانند بروزرسانی مقدار جاری  progress bar باید رویداد ProgressChanged  را کنترل کنید.و برای دریافت اعلان اتمام عملیات باید رویداد RunWorkerCompleted را کنترل کنید.

تفاوت BackgroundWorker و Thread

کلاس BackgroundWorker اساسا کار ایجاد و نظارت بر پردازش هر Thread را خلاصه میکند.همچنین BackgroundWorker به از بین رفتن نیاز به قفل کردن حافظه خود که در مورد استفاده از thread ها پیش می اید ،  کمک میکند.علاوه بر این ، این امکان را برای شرایط مسابقه یا race condition (شرایط مسابقه وضعیت ناخوش ایند است که زمانی اتفاق می افتد که دستگاه یا سیستم تلاش می کند همزمان دو یا چند عملیات را انجام دهد) فراهم می کند.علاوه بر این ، BackgroundWorker به گونه ای طراحی شده است تا به راحتی در هر Windows Form متصل و کار کند.

هر دو BackgroundWorker و thread یک مفهوم مشابه دارند، با این حال BackgroundWorker طراحی شده است که استفاده از threading آسان تر شود.

مثالی از BackgroundWorker  در C# Windows Form

در زیر مراحل مربوط به پیاده سازی BackgroundWorker  در یک Windows Form ساده در #C بیان شده است:

1) یک Windows Forms solution جدید ایجاد کنید

2)از تب Toolbox در سمت چپ ویژوال استودیو قرار دارد BackgroundWorker را بکشید و آن را به فرم جدید ببرید.

3)از همان جعبه ابزار، progress bar ، یک text box و 2 labelرا بکشید و در فرم رها کنید.

4)کد های زیر در واقع عملیات مربوط به BackgroundWorker  در #C را انجام میدهند.

public partial class BackgroundWorker : Form
    {
        public BackgroundWorker()
        {
            InitializeComponent();
            bgWorker.DoWork += BgWorker_DoWork;
            bgWorker.ProgressChanged += BgWorker_ProgressChanged;
            bgWorker.RunWorkerCompleted += BgWorker_RunWorkerCompleted;
        }

        private void btnStartCounting_Click(object sender, EventArgs e)
        {
            progressBar.Maximum = Convert.ToInt32(txtCount.Text);
            lblStatus.ForeColor = Color.Red;
            lblStatus.Text = "Counting...";
            bgWorker.WorkerReportsProgress = true;
            bgWorker.RunWorkerAsync();
        }

        private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (var Counter = 1; Counter <= progressBar.Maximum; Counter++)
            {
                bgWorker.ReportProgress(Counter);
                System.Threading.Thread.Sleep(50);
            }
        }

        private void BgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Done";
        }

        private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lblPercent.Text = e.ProgressPercentage.ToString();
            progressBar.Value = e.ProgressPercentage;
        }
    }

تصاویر مربوط به برنامه

عکس1)وضعیت ابتدای برنامه

شکل2)وضعیت در حال کار برنامه

شکل3)وضعیت اتمام کار برنامه

نتیجه

BackgroundWorker  یک راه اسان برای استفاده از threading  در Windows application ها را فراهم میکند.که سه رویداد اصلی دارد که به وسیله ان ها میتوانیم این کار را انجام دهیم.

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 6k بازدید
  • 6 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید