آشنایی با Task (ادامه)
آشنایی با Task (ادامه)
آشنایی با Task
دلایل استفاده ناهمگامی (Asynchrony)
برنامه نویسی Asynchronous به شما اجازه میدهد تا بتوانید اعمال مختلف را به صورت همزمان در برنامهی خود پیش ببرید. به عبارت دیگر، این قابلیت از Block شدن برنامه شما، در شرایطی که برنامه در حال انجام کاری طولانی مدت است، جلوگیری میکند و باعث میشود برنامه Responsive باقی بماند. از دیگر فواید برنامه Asynchronous، میتوان به استفاده از حداکثر توان سیستم اشاره کرد. امروزه اکثر پردازندهها، چندین هستهی پردازشی دارند که یک برنامهی غیر موازی نهایتا از یک هستهی پردازنده استفاده میکند اما با نوشتن یک برنامهی Asynchronous و ایجاد یک الگوی موازی سازی، محاسبات شما به صورت موازی روی هستههای مختلف CPU اجرا میشود.
سیشارپ یا بهتره بگم دات نت، قابلیتها و روشهای مختلفی را برای این کار فراهم کردهاست. یکی از قابلیتهایی که در سیشارپ 5 اضافه شده است، کلمات کلیدی async و await است. شما میتوانید تنها با استفاده از این 2 کلمه کلیدی، برنامه Asynchronous بنویسید! در پستهای بعدی آموزش مختصر و کوتاهی درباره این قابلیت جدید ارائه خواهم داد.
چند وقت پیش برای پروژهی یکی از درسها باید یک مقاله رو پیادهسازی میکردیم (گروه بودیم). این مقاله روی پیکسلهای تصویر پردازش انجام میداد و چون تعداد تصاویر ورودی زیاد بودن، حجم محاسبات زیاد بود.
اولین پیادهسازی ما با متلب بود که زمان اجرایی برابر با 24 ساعت داشت. از اونجایی که متلب به صورت ذاتی کمی کند هست، سراغ سیشارپ رفتیم. پس از اینکه با سیشارپ پیاده سازی انجام شد، مدت زمان اجرا به 8 ساعت رسید که به نظر خیلی خوب بود. کمی بعد یکی از دوستانم که کاملا به دستورات سیشارپ (حتی از نظر کارایی) مسلطه، کد رو بازبینی کرد و دو تغییر زیر را ایجاد کرد:
1. در یک قسمت از برنامه به جای
Math.Pow(x,2)
عبارت x * x را قرار داد.
2. در قسمت دیگری از برنامه، محاسبات با اعداد صحیح کافی بود ولی من از double استفاده کرده بودم، پس بجای آنها از int استفاده کرد.
پس از اجرای برنامه با تغییرات بالا، مدت زمان اجرا به 3 ساعت کاهش یافت. دلیل این اتفاق برای هریک از موارد بالا این است که:
1. تابع Pow در سیشارپ به دلیل اینکه قابلیت توان رساندن اعداد اعشاری را نیز داشته باشد، از روش ضربی استفاده نمیکند و بجای آن از روابط دیگری که محاسبات بیشتری لازم دارند استفاده میکند. حتی برای توان 2 (البته من فکر میکردم این تابع اونقدری هوشمنده که توانهای صحیح و یا کوچیکو بدونه باید چیکار کنه).
2. محاسبات اعشاری کلا زمان بیشتری نسبت به محاسبات صحیح مصرف میکنند.
از این به بعد همیشه به یاد خواهم داشت که تا جای ممکن از محاسبات صحیح استفاده کنم و کارهای سادهی ریاضیو مستقیم کد بزنم و از توابع استفاده نکنم.
فرض کنید اسم آرایه رشتهها temp و اسم لیست names باشد. اکنون داریم
names.AddRange(temp.Select(s => "_" + s + "_"));
تابع AddRange یک مجموعه را به عنوان ورودی میگیره و تمامی اون رو به لیست اضافه میکنه. اما با توجه به سوال، لازمه که تغییر داده شدهی رشتهها رو اضافه کنیم. که این هم از طریق دستور Select در LINQ به راحتی امکانپذیره.
در بخش کوتاه نویسی، ابتدا یک مسئله مطرح میشه و از شما خواسته میشه که کوتاهترین روشهاتونو براش بگید. بعد از گذشت چند روز از طرح مسئله، من هم جواب خودم رو مینویسم.
سوال:
فرض کنید آرایهای از رشتهها داریم و میخواهیم تک تک اعضای آن را به یک لیست از رشتهها اضافه کنیم و همزمان در ابتدا و انتهای هر رشته، کاراکتر '_' را قرار دهیم. کوتاه ترین روش برای این کار چیست؟
حتما تابهحال برنامههای زیادی رو دیدید که وقتی عبارتی رو برای جستجو وارد میکنید، در همون لحظه همزمان با تایپ شما، نتایج ممکن رو نشون میده. تو این پست قصد دارم با استفاده از امکانات Binding و Linq در #C و WPF این کار رو آموزش بدم.
گام اول: ایجاد TextBox و ListBox
در ابتدا لازمه که برای گرفتن ورودی از کاربر و نمایش نتایج جستجو، از یک عدد TextBox به همراه ListBox استفاده کنیم. نام TextBox را textbox قرار دهید.
گام دوم: تعیین منبع داده
با توجه به اینکه میخواهیم از این منبع برای ItemsSource یک ListBox استفاده کنیم، لازم است که جنس آن یک IEnumerable باشد. من در این مثال ابتدا یک کلاس Static تعریف کردهام و سپس در آن یک لیست Static از چند رشته Url ساختهام
گام سوم: نوشتن مبدل رشته به لیست
برای Binding مرحله بعد لازم است که یک مبدل یکطرفه با قابلیت تبدیل رشته (عبارت مورد جستجو) به نتیجهی جستجو نوشته شود
گام چهارم: Bind کردن ItemSource
در نهایت کافیست ItemSource مربوط به ListBox را به مقدار Text کنترل TextBox با استفاده از مبدل مرحله قبل Bind کنیم.