آموزش Async و Await در سی شارپ

لرن سایت,آموزش برنامه نویسی سی شارپ,آموزش طراحی سایت,آموزش برنامه نویسی اندروید,آموزش SQL c# android php jquery,قالب سایت

شما اینجا هستید : صفحه اصلی

با عضویت در کانال تلگرامی لرن سایت ، اولین فردی باشید که از تخفیفات و مطالب جدید خبردار می شوید !

آموزش Async و Await در سی شارپ

async و wait سی شارپ

امروزه برنامه نویسی ناهمگام (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 امتیاز)
اگه مطلب خوشتون اومد پس لطفا به اشتراک بذارین تا بقیه هم خوششون بیاد :)

نظرات

مشترک شدن
اطلاع رسانی از :
guest
9 نظرات
Inline Feedbacks
View all comments
mp123
mp123
3 سال گذشته

با سلام
من Method2 رو کامنت کردم. متد یک و سه هماجرا نمیشوند. چرا؟

roohollah
roohollah
4 سال گذشته

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

roohollah
roohollah
Reply to  roohollah
4 سال گذشته

پس از کلمات کلیدی await ,async
لزومی نیست؟

شریف پور
شریف پور
ادمین
Reply to  roohollah
4 سال گذشته

خیر در روش ذکر شده نیاز نیست.

احسان
احسان
4 سال گذشته

عالی بود، خدا قوت استفاده کردم

VAHID
VAHID
4 سال گذشته

ممنون عالی بود

بهنام
بهنام
4 سال گذشته

برای شروع به درک این مطالب ، عالی بود