درووستکردنی پێرمادیڵیت: بەکارهێنانی Asynchronous Programming

0
بابەت بڵاوبکەوە......
Share on FacebookEmail this to someoneShare on Google+Pin on PinterestTweet about this on TwitterShare on LinkedInShare on RedditShare on TumblrDigg this

پێرمادیڵیت بەرنامەیەکی سەرچاوەکراوەی سڕینەوی فایلی کۆمپیوتەرە. یەکێکە لە پڕۆژەکانی درەختی گەشەپێدەران. لە وتاری پێشتر بەرنامەیەکی بچووکمان درووستکردەوە کە هەمان کاری پێرمادیڵیتی دەکرد. بەڵام یەک کێشەی گەورەی هەبوو: کاتێک کە دوگمەی “Shred” مان دادەگرت، بەرنامەکە جامی دەکرد تا ئەو کاتەی فایلەکە بە تەواوی دەسڕاوە. لەو وتارە باسی ئەوە دەکەین چۆن دەتوانین بە بەکارهێنانی Asynchronous Programming ئەو کێشەیە چارەسەر بکەین.

بەشەکانی ئەو زنجیرە وتارە:

تێبینی گرنگ: ئەگەر دیسکەکەت SSD یە ئەوا واباشە ئەو بەرنامەیە لەسەری تاقی نەکەیتەوە. بۆ زانینی هۆکارەکەشی بەشی یەکەم بخوێنەوە. بەڵام دەتوانی هەندێک فایل لەسەر فلاش میمۆرییەک دابنێیت و بەرنامەکەی پێ تاقی بکەیتەوە.

ئەو بەرنامانەی کە بە WPF درووست دەکرێن، بە شێوەیەکی ئاسایی لە یەک Thread پێکدێن، کە پێی دەگوترێ UI Thread. بە نزیکەیی، Thread وەکو سایدی شەقامە. شەقام چەند سایدی زۆرتربێت، ئۆتۆمبێلی زۆرتر دەتوانن لە هەمان کاتدا دەتوانن پێیدا تێپەرببن، بەرنامەش چەند Threadی زۆرتر بەکاربێنێت، دەتوانێت کاری زۆرتر لەهەمان کاتدا بکات، بەبێ ئەوەی کارەکانی دیکەی ڕابگرێت. وە بەرنامەی ئاسایی Synchronous ـن. واتا ئەو ثرێدەی بەرنامەکە جێبەجێ دەکات لەسەر هەموو مێثۆدێک دەوەستێت و چاوەڕێ دەکات تاوەکو مێثۆدەکە تەواو دەبێت، بۆیەش ئەگەر ئەو مێثۆدە کاتی زۆری پێبچێت بەرنامەکە جام دەکات.

زۆر گرنگە لەوە تێبگەین کە زۆر کردار هەیە کە CPU ناتوانێت هیچ بکات بۆ خێراکردنیان، بۆ نموونە: کارکردن لەگەڵ دیسک، ناردنی ڕیکوێستی وێب، نێتوۆرک و هتد… هەر بۆیەش پێویست ناکات CPU لەسەریان بوەستێت و هەموو کارەکانی دیکە ڕابگرێت تا تەواو دەبن. ئەو لەسەر نەوەستانە پێی دەگوترێ Asynchronous Programming. لە پاکترین شێوەیدا Asynchronous Programming پێویستی بە ثرێدی زیادە نییە و هەر لەسەر یەک ثرێد جێبەجێ دەکرێت.

با نموونەیەک بهێنینەوە. وای دابنێ دەتەوێ هێلکە و چا بۆ نانی بەیانی ئامادە بکەیت:

  • لە حاڵەتی Synchronous Programming: یەکەمجار هێلکەکە دەکوڵینی و چاوەڕێ دەکەیت تا تەواو ئامادەدەبێت. دواتری چایەکە ئامادە دەکەیت و دواتر سفرەکە ڕێکدەخەیت.
  • لە حاڵەتی Asynchronous Programming: یەکەمجار هێلکەکە لەسەر ئاگر دایدەنێیت وازی لێدێنیت بۆ ئەوەی بکوڵێ و دەچی چایەکەش لەسەر ئاگر دادەنێی. لەو ماوەیەدا دەچی سفرەکە ڕێکدەخەیت. دواتر کە هێلکەکە کوڵا لەسەر ئاگر دەهێنیتە خوارەوە و کە چایەکەش کوڵا بەهەمان شێوە ئامادەی دەکەیت و لەسەر سفرەی دادەنێیت.
  • لە حاڵەتی Asynchronous Programming + Multithreading وەک ئەوە وایە چەند کەسێکی دیکەش بێن و یارمەتیت بدەن لە کارەکاندا، بەڵام ئێستا دەبێ ئاگامان لێبیت چیشتەکە سوێر دەرنەچێت! کلیک بکە بۆ زانیاری زۆرتر لەسەر Multithreading.

دۆت نێت فرەیموۆرکیش پشتگیرییەکی زۆر باشی Asynchronous Programming دەکات و لە وەشانی ٤.٥ وە کارەکانی زۆر ئاسانتر کردووە بەهۆی فەراهەمکردنی کیوۆردی async و await. وە هەروەها چەندین مێثۆدی Asynchronous بۆ API یەکەی زیاد کراوە، ئەو جۆرە مێثۆدانە زۆربەی کات ناوەکانیان پاشگری “Async” پێوەیە.

Asynchronous Programming بابەتێکی کەمێک قووڵە و تێگەیشتنی کەمێک کاتی دەوێ، بەڵام ئامرازێکی زۆر بەهێزە و بەرنامەکانمان زۆر باشتر دەکات. یەکێک لە کتێبە باشەکانیش دەربارەی Asynchronous Programming، کتێبی Concurrency in C# Cookbookی Stephen Curry یە. لێرەش نووسەری کتێبەکە بەکورتی باسی Async و Await دەکات. وە ئەو زنجیرە ڤیدیۆیەی Jeremy Clark زۆر بەسوودە و شتەکان بە سادەیی باس دەکات. وە بۆ چەند ئامۆژگارییەک لەسەر بەکارهێنانی Asynchronous Programming لە دۆت نێت فرەیموۆرک سەیری ئێرە بکە.

زۆرباشە، ئێستا با بچین دەستکاری کۆدی بەرنامەکەمان بکەین. سەرەتا دەچین مێثۆدی OverWriteFile دەستکاری دەکەین بۆ ئەوەی UI Thread بلۆک نەکات:

تێبینی بکە چەند شتێک گۆڕاوە:

  • کیوۆردی Async زیاد کراوە. ئەو کیوۆردە بۆ ئەوە زیاد دەکەی تاوەکوو بتوانین لەناو مێثۆدەکە await بەکاربهێنین.
  • لە بڕی void ئێستا ڕیتێرن تایپی مێثۆدەکە Task ـە. لێرەدا ئەوە بۆ ئەوەیە کە ئەگەر exception ێک ڕوویدا، بتوانین catchی بکەین. هەموو کات واباشە خۆت بپارێزی لە بەکارهێنانی void وەک ڕیتێرن تایپی مێثۆدە Asynchronous ـەکان، تەنها لەو کاتانە بەکاری بهێنە کە مێثۆدەکە Event Handler بێت یانیش لەناو کۆنسترەکتەر بەکارهاتبێتەوە.
  • پاشگری Async مان بۆ ناوی مێثۆدەکە زیاد کرد، ئەوە تەنها وەکو عادەتێکە (Convention) بۆ ناسینەوەی مێثۆدە Asynchronous ـەکان. ئاساییە ئەگەر زیادیشی نەکەی.
  • لەبری stream.Write() و stream.Flush() ئێستا stream.WriteAsync() و stream.FlushAsync() بەکار دەهێنین. ئەو دوو مێثۆدە هی دۆت نێت فرەیموۆرکن. تێبینیش بکە لەپێش هەردووکیان نووسراوە await. هەر کاتێک بەرنامەکە دەگاتە کیوۆردی await، ئەوا UI Thread جێبەجێکردنی مێثۆدەکە هەڵدەپەسێرێت و ئازاد دەبێت لە ڕاپەڕاندنی کارەکانی دیکە و وەڵامدانەوەی داواکارییەکانی بەکارهێنەر. هەر کە کردارەکە (بۆ نموونە: stream.WriteAsync()) تەواو بوو، ئەو کات ثرێدەکە دەگەڕێتەوە هەمان شوێن باقی مێثۆدەکە تەواو دەکات.

زۆر باشە، ئێستا OverwriteFileAsync ئامادەیە. ئێستا دەستکاری مێثۆدی ShredFile دەکەین و لەوێدا OverWriteFileAsync بەکاردەهێنینەوە:

ئێستاش دەبێت بچین دەستکاری کۆدی دوگمەکەش بکەین بۆ ئەوەی سوود لە ShredFileAsync وەربگرێت:

دوای داگرتنی دوگمەی Shred، ئێمە ئەو دوگمەیە ناچالاک دەکەین، بۆ ئەوەی بەکارهێنەر دووبارەی داینەگرێتەوە و بزانێت کەوا بەرنامەکە خەریکە فایلەکە دەسرێتەوە. وە دوای کۆتایی هاتنی سڕینەوەکە دوگمەکە دووبارە چالاک دەکەینەوە.

ئێستا دەتوانین بەرنامەکە ڕەن بکەین و دەبینین بەرنامەکەمان تەواو Responsive ـە و جام ناکات. بەوەش بەکارهێنەران ئەزموونێکی خۆشتریان دەبێت لە بەکارهێنانی بەرنامەکە. لەوانەیە کاریگەری گۆڕانکارییەکان لەسەر فایلی بچووک دەرنەکەوێت، بەڵام هەوڵبدە فایلێکی گەورەی پێ بسرێتەوە و سەیری جیاوازییەکەی بکە. بێگومان هێشتا دەکرێ بەرنامەکە زۆر باشتر دەکرێ، بۆ نموونە زیادکردنی توانای سڕینەوەی فۆڵدەر، توانای پاشگەزبوونەوە (Cancel) لە سڕینەوەی فایلەکان و نیشاندانی ڕێژەی تەواوبوونی سڕینەوەکەو هتد.. هەموو ئەو شتانە لە Permadelete دا هەن و دەتوانی سەیری کۆدەکەی بکەیت و بزانی چۆن درووستکراوە.

دەتوانی هەموو کۆدەکانی ئەو وتارە لێرە داببەزێنی.

قوتابی بەشی ئەندازیاریی سیستەمی زانیاری لە زانکۆی پۆلیتەکنیکی هەولێر

لێدوانێک بنووسە