برنامه نویسی موازی در دات نت (c#.net)

 
ارسال شده در تاریخ 1394/5/25 توسط admin در زمینه آموزش سی شارپ
 
آموزش زبانهای برنامه نویسی کامپیوتری

مقدمه : 

امروز میخواهیم یک مسئله جالب و مهم را برای شما مطرح نماییم. در طی بررسی های اخیر تیم برنامه نویسی مرکز پروژه و مقالات متوجه شدیم که برنامه نویسی موازی (asynchronous programming)  برای کاربران بسیار دشوار می باشد؛ مشکل مربوط به برنامه نویسی موازی در بسیاری از موارد نیز موجب آزار و عزیت برنامه نویسان تیم مرکز پروژه و مقالات می شد.

ولی با این حال باید به این مسئله توجه کنیم که برنامه نویسی موازی با توجه به بالا رفتن داده های ذخیره شده در منابع اطلاعاتی مختلف حائز اهمیت زیادی می باشد. و این مسئله که هر منبع اطلاعاتی یک زمان پاسخ مربوط به خود را دارد ارزش مسئله را افزایش می دهد. حال اگر بتوانیم  برای دانشجویان کمک کنیم که این مسئله را ساده تر درک کنند بسیار خوش حال خواهیم شد.

وقتی که سخن از برنامه نویسی موازی به میان می اید .net راه حل ها و ابزار های مختلفی را برای این مسئله برای ما معرفی می نماید.  زبان برنامه نویسی سی شارپ با استفاده از کلاس ها و  کلمات کلیدیی همچون async  ،  awaitو ابزار های گوناگون، برنامه نویسی موازی را برای کاربران آسان می نماید. دستوراتی همانند async  ،  await با استفاده از یک حلقه ی while کارایی خود را به شما نشان خواهند داد؛ ما در این مقاله سعی بر آن داریم تا با استفاده از زبان ساده مقدمه ای در مورد پردازش موازی را برای شما مطرح نماییم.

مفاهیم اولیه ی .net در مورد پردازش موازی : 

مهمترین چیز برای درک این مسئله در دات نت درک ارتباط بین کلمات کلیدی async  و  awaitمی باشد. کار اصلی در این مسئله اجرای یک برنامه موازی بر روی یک کامپیوتر با پردازنده چند هسته ای و شبیه سازی آن می باشد. در داخل .net و c# تمامی کارهای موازی سازی (multithreading)  از قبیل کنترل فرایند ها ، انتساب هسته مورد نظر به فرایند و تعویض هسته ها بین فرایند ها به صورت اتوماتیک انجام می گیرد؛ این مسئله باعث می شود شما بدون نیاز به دقت زیاد و تحمل بار مدیریتی کنترل فرایند ها عمل موازی سازی را انجام دهید.

کار کردن با async  و  await : 

وقتی که شما از دستور async   استفاده می کنید، روش کاری خود که همان حالت موازی است  را برای .net مشخص می نماییدو .net  از شما دو چیز را انتظار دارد:

1. تابعی که قرار است در حالت موازی اجرا شود

2. روش استفاده شما از دستور await در داخل متد موازی می باشد

لطفا به مثال زیر برای درک بهتر مسئله توجه نمایید 

   
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace Reselbob.DownAndDirty
{
   public class AsyncDemo
   {
      public async Task<bool> DoTimeIntensiveWork()
      {
         await Task.Run(() =>
         {
            Console.WriteLine(@"The threadId for the Task
               running in AsyncDemo.DoTimeIntensiveWork()
               is: {0}",
               Thread.CurrentThread.ManagedThreadId);
               var time = DateTime.Now.ToString("hh:mm:ss:fff");
            Console.WriteLine(@"Start time for the Task in
               AsyncDemo.DoTimeIntensiveWork(): {0}", time);
 
            //put the task to sleep to emulate time working
            Thread.Sleep(500);
 
            Console.WriteLine("--- behavior that takes 1/2
               second ---");
            time = DateTime.Now.ToString("hh:mm:ss:fff");
            Console.WriteLine(@"The Task in
               AsyncDemo.DoTimeIntensiveWork() finished at: {0}",
               time);
         });
 
         return true;
      }
   }
}

مثال 1 :  یک راه حل ساده برای استفاده از دستورات async  و  await

در بخش بعدی ادامه این مسئله را با هم بحث خواهیم کرد

Copyright © 2014 icbc.ir