همانطور که میدانید سیشارپ مفهومی به نام Queue یا صف دارد که میتوان آن را برای انواع متغیرها ساخت، در آن مورد جدیدی Enqueue کرد و سپس در یک چرخه تک تک Dequeue کرده و استفاده کرد؛ ساختار آن به صورت FIFO است.
در یکی از پروژهها نیاز داشتم تا اگر کاربر کاری را انجام داد تعدادی دستور یکی پس از دیگری انجام شود. ممکن بود کاربر پشت سر هم آن کار را انجام دهد و در این حالت نرم افزار تا پایان پردازش تمام دستورات قفل میکرد. در فکر این بودم که چقدر خوب بود اگر میشد به جای متغیر، دستورات یا همان متدها را وارد یک صف میکردیم تا یکی یکی اجرا شوند؛ کمی در موردش جستجو کردم که آیا میشود؟ و میشد 🙂
یکی از انواع متغیر در سیشارپ Action است. در توضیح آن آمده:
Encapsulates a method that has no parameters and does not return a value
یک متدی که پارامتری ندارد و مقداری را برنمیگرداند را در خود ذخیره میکند
حقیقا از اینکه دیدم سیشارپ چنین قابلیتی دارد هم به شدت تعجب کردم هم خوشحال شدم (سی یاد بگیر! با تو باید const char* رو هم دستی به char* تبدیل کنم! 😐). با کمی تلاش این فرمول به دست آمد:
- اول یک صف از نوع Action بسازید:
1Queue<Action> myQueue = new Queue<Action>(); - یک BackgroundWorker میسازیم تا همیشه بررسی کند که آیا دستوری در صف وجود دارد؟ و اگر وجود داشت اجرا کند:
12345678910111213var myBW = new BackgroundWorker();myBW.DoWork += (s, o) =>{while (true){if (myQueue.Count > 0){Action action = myQueue.Dequeue(); // Get last actionaction(); // Calls that action}}};myBW.RunWorkerAsync(); - حالا هرجا لازم شد اینطوری دستورات را به صف اضافه میکنیم:
1234myQueue.Enqueue(() =>{System.Threading.Thread.Sleep(1200);});
میبینید که دستورات یک به یک اجرا میشوند.