امروزه برنامه نویسی ناهمگام (Asynchronous) نزد دولوپر ها بسیارمحبوب شده است.

وقتی ما با Ui سروکار داریم و یک متد که زمان اجرای آن طولانیست ( مثل خواندن یک فایل بزرگ و ذخیره آن در پایگاه داده) را در رویداد کلیکِ یک دکمه میگذاریم زمانی که روی آن دکمه کلیک شود رابط کاربری اپلیکیشن قفل شده و به اصطلاح هنگ میکند ، زیرا رابط کاربری و بقیه متد ها در برنامه نویسی همگام (Synchronous) در یک نخ (Thread) از سی پی یو اجرا میشوند پس رابط کاربری تا زمانی که فعالیت متد خاتمه نیابد پاسخی به کاربر نمیدهد.

برنامه نویسی ناهمگام در این شرایط بسیار کار آمد است ، زیرا در این روش رابط کاربری و متد ها به هم متکی نبوده و متد ها به صورت جداگانه اجرا میشوند.

async و await دو برچسب هستند که مشخص میکنند در کدام بخش کد پاسخ دهی باید بعد از اتمام کار از سر گرفته شود.

خب ، وقت این است که با چند مثال کاربردی کاربرد برنامه نویسی ناهمگام را درک کنیم :

مثال های ساده برای درک Async و Await در سی شارپ

مثال 1 :

در این مثال ما دو متد داریم که به هم متکی نیستند:

کد:

    class Program  
        {  
            static void Main(string[] args)  
            {  
                Method1();  
                Method2();  
                Console.ReadKey();  
            }  
              
            public static async Task Method1()  
            {  
                await Task.Run(() =>  
                {  
                    for (int i = 0; i < 100; i++)  
                    {  
                        Console.WriteLine(" Method 1");  
                    }  
                });             
            }  
      
              
    public static void Method2()  
            {  
                for (int i = 0; i < 25; i++)  
                {  
                    Console.WriteLine(" Method 2");  
                }  
            }  
    }

در کد بالا متد یک و متد دو به هم متکی نیستند و ما از متد Main آن هارا صدا میزنیم و میبینیم که متد ها کاری به یکدیگر ندارند.

خروجی:

خب ، حالا به سراغ مثال بعد برویم ، فرض کنید ما یک متد سه هم داریم که متد یک متکی است.

مثال 2 :

در این مثال متد 1 طول یک عدد صحیح را  به ما بر میگرداند ، که ما به صورت ورودی آن را به عنوان طول به متد 2 میدهیم ( پس متد 2 نیاز به یک ورودی دارد که متد 1 آن را به ما بر میگرداند)

اینجا ما باید از کلمه await قبل از دادن طول عدد به عنوان ورودی استفاده کنیم که لازمه استفاده از await ، استفاده از کلمه async در متد صدا زننده است.

ما نمیتوانیم کلمه await را بدون async استفاده کنیم ، و اگر ما در متد Main کلمه Async را استفاده کنیم به این ارور میخوریم:

پس ما یک متد به نام callMethod تعریف میکنیم و در آن متد های خود را به ترتیب صدا میزنیم:

کد:

    class Program  
        {  
            static void Main(string[] args)  
            {  
                callMethod();  
                Console.ReadKey();  
            }  
      
            public static async void callMethod()  
            {  
                Task<int> task = Method1();  
                Method2();  
                int count = await task;  
                Method3(count);  
            }  
      
            public static async Task<int> Method1()  
            {  
                int count = 0;  
                await Task.Run(() =>  
                {  
                    for (int i = 0; i < 100; i++)  
                    {  
                        Console.WriteLine(" Method 1");  
                        count += 1;  
                    }  
                });  
                return count;  
            }  
      
              
           public static void Method2()  
            {  
                for (int i = 0; i < 25; i++)  
                {  
                    Console.WriteLine(" Method 2");  
                }  
            }  
      
      
            public static void Method3(int count)  
            {  
                Console.WriteLine("Total count is " + count);  
            }  
    }

 

در کد بالا ، متد 3 یک ورودی میخواهد که وابسته به متد یک هست ، اینجاست که کلمه await نقش مهمی را برای صبر کردن برای اتمام و متد 1 و دادن آن به عنوان ورودی به متد 3 ایفا میکند.

خروجی:

یک مثال واقعی

async و await از دات نت فریمورک 4.5 به بعد پشتیبانی میشوند که ما میتوانیم در پروژه های خود از آن ها استفاده کنیم.

برخی از Api  های پیشفرض در سی شارپ مانند : اچ تی تی پی کلاینت ، استریم ها و ….  Async هستند که با کلمه Async بعد از نام متد میتوان آن هارا تشخیص داد .

دراین مثال ما قصد داریم که کل کاراکتر های یک فایل متنی بزرگ را بخوانیم و تعداد کل کاراکتر های موجود در آن فایل را بدست آوریم.

 

کد:

    class Program  
        {  
            static void Main()  
            {  
                Task task = new Task(CallMethod);  
                task.Start();  
                task.Wait();  
                Console.ReadLine();  
            }  
      
            static async void CallMethod()  
            {  
                string filePath = "E:\\sampleFile.txt";  
                Task<int> task = ReadFile(filePath);  
      
                Console.WriteLine(" Other Work 1");  
                Console.WriteLine(" Other Work 2");  
                Console.WriteLine(" Other Work 3");  
      
                int length = await task;  
                Console.WriteLine(" Total length: " + length);  
      
                Console.WriteLine(" After work 1");  
                Console.WriteLine(" After work 2");  
            }  
      
            static async Task<int> ReadFile(string file)  
            {  
                int length = 0;  
      
                Console.WriteLine(" File reading is stating");  
                using (StreamReader reader = new StreamReader(file))  
                {  
                    // Reads all characters from the current position to the end of the stream asynchronously  
                    // and returns them as one string.  
                    string s = await reader.ReadToEndAsync();  
      
                    length = s.Length;  
                }  
                Console.WriteLine(" File reading is completed");  
                return length;  
            }  
    }

 

در مثال بالا ما از متد ReadFile برای خواندن طول کاراکتر های فایل خود استفاده میکنیم.

در فایل sampleText.txt ما کارکتر های زیادی وجود دارد و خواندن تمام آن ها زمان زیادی میبرد.

 

در اینجا ، ما از async استفاده میکنیم ، به همین دلیل برنامه منتظر متد برای دریافت خروجی  نمانده و بقیه خط های کد را اجرا میکند ، اما در کد زیر ما از await استفاده کردیم تا برنامه منتظر خروجی بماند:

int length = await task;  
            Console.WriteLine(" Total length: " + length);

بعد از آن بقیه خظوط به صورت پیوسته اجرا میشوند

    Console.WriteLine(" After work 1");  
                Console.WriteLine(" After work 2");

خروجی

این نکات کلیدی را همیشه باید به یاد داشته باشیم:

اگر ما از کلمه await در متد خود استفاده نکنیم برنامه ما به صورت معمولی اجرا شده و کمپایلر آن را به عنوان همگام در نظر میگیرد ( کمپایلر یک اخطار در این زمینه به ما میدهد اما هیچ اروری به ما داده نمیشود)

بدین ترتیب ما میتوانیم از دو کلمه کلیدی async و await در سی شارپ به صورت ناهمگام کد بزنیم .

امیدوارم از این مطلب استفاده کافی را برده باشید ، حالا نوبت شماست ، نظرات و سوالات خود را در رابطه با async و await در بخش نظرات همین مطلب مطرح کنید تا توسط کارشناسان ما پاسخ خود را دریافت کنید.

 

 

 

 

 

5/5 - (3 امتیاز)
فرهاد محسنی

مشاهده نظرات

  • سلام ببخشید من یه برنامه نوشتم که 100 تا تصویر 3مگ رو لود میکنم با حلقه توسط متد1. بعد ارجاع میدم به متد2 ادیت میکنم روی تصاویر بعد با فراخوانی متد3 ذخیره میکنم تصاویر رو وقتی این برنامه اجرا میشه کاملا انتظارمو براورده میکنه ولی قبل انجام پروسه یه چند دقیقه ای هنگ میکنه سیستم یعنی cursor حرکت میکنه ولی تمام فرم از فعال بودن میفته(در توضیح مدل هنگ کردن :رویداد mousehover برای هیچکدوم از کنترل ها فعال نمیشه تا چند دقیقه).
    حالا راه حل چیه
    از مدل چند نخی استفاده کنم یا await,async یا هرسه؟

آخرین مطالب

نحوه هلتداری مدرن و کارآمد

مکانیسم هتلداری پیشرفته در دنیای امروزی که تکنولوژی تمام ابعاد زندگی و کار را در… ادامه مطلب

ژوئن 6, 2020

سیستم نرم افزار هتلداری

امروزه هتل‌ها در دنیای صنعت گردشگری یکی از ارکان اساسی محسوب می‌شوند. ارائه‌ی خدمات با… ادامه مطلب

می 22, 2020

نحوه انبارداری شرکت آمازون

موفقیت کسب و کارهای بزرگ، همیشه الگوی مناسبی برای کسب و کارهای کوچک‌تر است. آمازون… ادامه مطلب

آوریل 26, 2020

طراحی نرم افزار انبارداری

  یکی از مهم‌ترین و کلیدی‌ترین بخش‌های یک سازمان، انبار محصولات یا خدمات آن است.… ادامه مطلب

آوریل 21, 2020

طراحی نرم افزار مالی و حسابداری

این روز ها با تقریب خوبی می توان گفت شرکت یا بیزینسی باقی نمانده است… ادامه مطلب

ژانویه 30, 2020

چگونه برنامه نویس موفق اندروید شویم؟

از آنجا که اپلیکیشن های موبایل بیشتر و بیشتر مردم را از راه های خلاقانه… ادامه مطلب

ژوئن 15, 2019