ایجاد پنجره Non Freezing در#C
جمعه 27 آذر 1394در این مقاله قصد داریم یک پنجره وب فرم ساده بسازیم و رویدادی برای توقف برنامه و رویدادی برای اجرا کردن برنامه در ویندوز فرم بنویسیم
ابتدا یک پروژه ی جدید ایجاد نمایید به صورت زیر:
یک دکمه داخل صفحه قرار دادیم برای دکمه رویداد زیر را می نویسیم:
private void button1_Click(object sender, EventArgs e) { for (var i = 0; i <= 1000000; i++) { label1.Text = @"Count : " + i; } }
زمانی که روی دکمه کلیک نمایید می توانید freez شدن نرم افزار را مشاهده نمایید.
اگر task Manager خود را باز نمایید آن را مشاهده خواهید کرد.
حالا یک دکمه ی دیگر قرار می دهید و رویداد زیر را در داخل آن می نویسید:
رویداد به صورت زیر خواهد بود:
//attributes used to refresh UI private readonly SynchronizationContext synchronizationContext; private DateTime previousTime = DateTime.Now; public Form1() { InitializeComponent(); synchronizationContext = SynchronizationContext.Current; //context from UI thread } private async void button2_Click(object sender, EventArgs e) { button1.Enabled = false; button2.Enabled = false; var count = 0; await Task.Run(() => { for (var i = 0; i <= 1000000; i++) { UpdateUI(i); count = i; } }); label1.Text = @"Count : " + count; button1.Enabled = true; button1.Enabled = false; } public void UpdateUI(int value) { var timeNow = DateTime.Now; //Here we only refresh our UI each 50 ms if ((DateTime.Now - previousTime).Milliseconds <= 50) return; //Send the update to our UI thread synchronizationContext.Post(new SendOrPostCallback(o => { label1.Text = @"Count : " + (int)o; }), value); previousTime = timeNow; }
کلمه ی ASYNC را که در رویداد خود قرار داده ایم برای جلوگیری از از Freez شدن نرم افزار است.و زمانی که دکمه را فشار دهیم شروع به شمارش می کند که هر 50 میلی ثانیه label ای که قرار داده ایم به روز رسانی می شود.
خروجی به صورت زیر خواهد بود:
- C#.net
- 1k بازدید
- 3 تشکر