موضوع : نمایش یک Loader همزمان با اجرای یک پردازش سنگین
چیزی که میخوام انجام بدم : بعد از کلیک روی یک دکمه در داخل این رویداد
1- یک لودر (یک گیف یا انیمیشن) نشان دهم (Visible)
2- عملیات سنگین هم شروع به کار کند
3- در پایان عملیات سنگین لودر هم مخفی شود
کاری که انجام دادم :
private void Button1_Click(object sender, RoutedEventArgs e)
{
Spinner.Visibility = Visibility.Visible;
Task.Run(() =>
{
//Simulation Long Process
var TheRsult = dbms.Database.SqlQuery<object>("WAITFOR DELAY '00:00:03' SELECT GETDATE()").FirstOrDefault();
//Thread.Sleep(500);
for (int i = 0; i < 1000; i++)
{
Console.Write(i);
}
MessageBox.Show("Finished", "Information", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.Yes);
Dispatcher.Invoke(() =>
{
Spinner.Visibility = Visibility.Collapsed;
});
});
}
مشکل چیه ؟
- زمانی که عملیات داخل رویداد کلیک در حال پردازش است پنجره شما (برنامه در حال اجرا) به حالت قفل و فریز شده میرود و نمیتوان با آن هیچ کاری انجام داد , تا پایان پردازش
پس من سعی کردم که دستور نمایش لودر رو داخل یک Task (Thread) بذارم به این شکل :
//still Ui will frezz after pressing the button !
Dispatcher.Invoke(() =>
{
Spinner.Visibility = Visibility.Visible;
});
اما باز هم یو آی (UI) قفل مشید !
من نمیخوام عملیات اصلی رو داخل یک تِرِد بذارم (عملیات سنگین) میخوام به یه شکلی بتونم لودر خودم رو موقع پردازش سنگین به شکلی که برنامه قفل و فریز نشه نشان بدم .
یک فانکشن DoEvents هم هست که ظاهرا استفاده از اون کار صحیحی نیست و درضمن کار هم نکرد ! ☻:
public void DoEventsWPFY()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}
public void DoEventsWPFY2()
{
var frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(
delegate (object f)
{
((DispatcherFrame)f).Continue = false;
return null;
}), frame);
Dispatcher.PushFrame(frame);
}
public void DoEventsWPFY3()
{
var minFrameDelay = Observable.Interval(TimeSpan.FromMilliseconds(50)).Take(1).Replay();
minFrameDelay.Connect();
// synchronously add a low-priority no-op to the Dispatcher's queue
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => minFrameDelay.Wait()));
}
//یا ریفرنس ویندوز فرم رو به پروژه تون اضافه کنید و اینطوری صداش کنید :
System.Windows.Forms.Application.DoEvents();
// DoEvents();
// Your Code ...
//DoEvents();
سورس کامل : Full Source Code
منابع :
- https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive
- https://stackoverflow.com/questions/24804136/how-do-i-stop-my-ui-thread-from-locking-up
چه کاری باید انجام بدم ؟
لطفا راهنمایی بفرمایید
باتشکر از همگی
تاریخ :
1404/03/22
- ساعت :
11:10:00 AM
- بازدید :
90
- پاسخ :
1
|
تاریخ :
1401/10/18
- ساعت :
12:15:00 AM
- بازدید :
2173
- پاسخ :
1
|
تاریخ :
1403/12/23
- ساعت :
03:14:00 PM
- بازدید :
374
- پاسخ :
1
|
تاریخ :
1404/03/06
- ساعت :
03:00:00 PM
- بازدید :
144
- پاسخ :
2
|
تاریخ :
1398/10/01
- ساعت :
01:02:00 PM
- بازدید :
5941
- پاسخ :
1
|
تاریخ :
1399/11/10
- ساعت :
10:01:00 PM
- بازدید :
7605
- پاسخ :
5
|
تاریخ :
1404/01/28
- ساعت :
10:46:00 AM
- بازدید :
177
- پاسخ :
1
|
تاریخ :
1404/01/28
- ساعت :
10:27:00 AM
- بازدید :
156
- پاسخ :
1
|
تاریخ :
1404/01/25
- ساعت :
03:09:00 PM
- بازدید :
207
- پاسخ :
1
|
تاریخ :
1403/12/22
- ساعت :
11:05:00 AM
- بازدید :
381
- پاسخ :
1
|
تاریخ :
1399/12/17
- ساعت :
02:47:00 PM
- بازدید :
8006
- پاسخ :
4
|
تاریخ :
1401/01/28
- ساعت :
04:04:00 PM
- بازدید :
2654
- پاسخ :
1
|
تاریخ :
1404/04/04
- ساعت :
02:25:00 PM
- بازدید :
30
- پاسخ :
1
|
تاریخ :
1404/04/04
- ساعت :
03:35:00 PM
- بازدید :
40
- پاسخ :
1
|
تاریخ :
1404/03/22
- ساعت :
06:32:00 PM
- بازدید :
77
- پاسخ :
0
|
تاریخ :
1403/10/08
- ساعت :
06:22:00 PM
- بازدید :
324
- پاسخ :
1
|
تاریخ :
1399/07/29
- ساعت :
05:26:00 PM
- بازدید :
8968
- پاسخ :
1
|
تاریخ :
1404/03/22
- ساعت :
11:17:00 PM
- بازدید :
121
- پاسخ :
2
|
تاریخ :
1404/03/20
- ساعت :
01:31:00 PM
- بازدید :
65
- پاسخ :
1
|
تاریخ :
1404/03/22
- ساعت :
11:10:00 AM
- بازدید :
90
- پاسخ :
1
|