مقدمه:
یکی از نیاز های متداول در برنامه نویسی نامتقارن (asynchronous) امکان اطلاع از
میزان پیشرفت یک فرایند می باشد. نمایش یه نوار پیشرفت (progress bar) از جمله
نیازهای متدوال می باشد. در این ترفند به معرفی یکی از ساده ترین روش ها جهت انجام
این کار می پردازیم.
آغاز:
برای انجام این کار نیاز به استفاده از کلاس
Progress<T> و اینترفیس IProgress<T>می باشد.
به عملکرد تابع async زیر توجه کنید.
public static async Task MyLongAsyncOperation(IProgress<int> progress)
{
int percentCompleted = 0;
var isDone = false;
while (!isDone)
{
await Task.Delay(1000);
percentCompleted += 20;
progress.Report(percentCompleted);
if (percentCompleted == 100)
{
isDone = true;
}
}
}
این تابع پارامتری از جنس
IProgress<int> را دریافت می نماید و در یک حلقه تا زمانی که میزان
پیشرفت کمتر از 100 درصد باشد، میزان این پیشرفت را با استفاده از متد Report در
اینترفیس
IProgress به فراخواننده این تابع گزارش می دهد. در این مثال ما از نوع
داده int استفاده کرده ایم ولی بسته به نیاز برنامه، شما می توانید از
انواع مختلف داده
استفاده کنید.
جهت شبیه سازی یک پروسه زمانبر، ما یک ثانیه تاخیر در متد ایجاد نموده و سپس
میزان پیشرفت را به اندازه 20 درصد افزایش داده ایم.
اکنون زمان نوشتن فراخواننده این تابع فرا رسیده است.
static void Main(string[] args)
{
Progress<int> progress = new Progress<int>();
progress.ProgressChanged += progress_ProgressChanged;
MyLongAsyncOperation(progress);
Console.ReadKey();
}
static void progress_ProgressChanged(object sender, int e)
{
Console.WriteLine(string.Format("Completed {0}%", e));
}
همانطور که ملاحظه می نمایید، کد مربوطه بسیار ساده و سر راست می باشد. ابتدا
نمونه ای از کلاس Progress ایجاد نموده و سپس رخداد مروبطه به ProgressChanged را
پیاده سازی نموده ایم. این رخداد هنگامی که تابع async ما متد Report را فراخوانی
کند، اتفاق می افتد و ما در این مثال میزان پیشرفت را روی صفحه نمایش چاپ کرده ایم.
نتیجه اجرای کد را در شکل زیر ملاحظه می نمایید.
همانطور که مشاهده فرمودید با استفاده از این روش به ساده ترین شکل ممکن می
توانیم از میزان پیشرفت یک فرایند طولانی async مطلع گردیم.
سورس مثال این مقاله از طریقه لینک بالای
صفحه قابل دانلود می باشد.