موضوع : نمایش یک 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/01/28
- ساعت :
10:46:00 AM
- بازدید :
89
- پاسخ :
1
|
تاریخ :
1404/01/28
- ساعت :
10:27:00 AM
- بازدید :
78
- پاسخ :
1
|
تاریخ :
1404/01/25
- ساعت :
03:09:00 PM
- بازدید :
93
- پاسخ :
1
|
تاریخ :
1403/12/23
- ساعت :
03:14:00 PM
- بازدید :
251
- پاسخ :
1
|
تاریخ :
1403/12/22
- ساعت :
11:05:00 AM
- بازدید :
299
- پاسخ :
1
|
تاریخ :
1399/11/25
- ساعت :
11:22:00 AM
- بازدید :
4032
- پاسخ :
2
|
تاریخ :
1403/12/02
- ساعت :
12:09:00 AM
- بازدید :
375
- پاسخ :
1
|
تاریخ :
1398/07/08
- ساعت :
12:21:00 AM
- بازدید :
3088
- پاسخ :
2
|
تاریخ :
1403/11/23
- ساعت :
08:24:00 PM
- بازدید :
284
- پاسخ :
2
|
تاریخ :
1399/11/10
- ساعت :
10:01:00 PM
- بازدید :
7346
- پاسخ :
4
|
تاریخ :
1400/04/26
- ساعت :
03:28:00 PM
- بازدید :
5212
- پاسخ :
1
|
تاریخ :
1403/12/01
- ساعت :
01:07:00 PM
- بازدید :
247
- پاسخ :
0
|
تاریخ :
1403/12/26
- ساعت :
03:13:00 PM
- بازدید :
142
- پاسخ :
1
|
تاریخ :
1404/02/04
- ساعت :
04:31:00 PM
- بازدید :
77
- پاسخ :
1
|
تاریخ :
1404/01/28
- ساعت :
09:29:00 PM
- بازدید :
91
- پاسخ :
1
|
تاریخ :
1404/01/29
- ساعت :
10:55:00 AM
- بازدید :
72
- پاسخ :
1
|
تاریخ :
1404/01/28
- ساعت :
10:46:00 AM
- بازدید :
89
- پاسخ :
1
|
تاریخ :
1404/01/28
- ساعت :
10:27:00 AM
- بازدید :
78
- پاسخ :
1
|
تاریخ :
1404/01/26
- ساعت :
05:27:00 PM
- بازدید :
170
- پاسخ :
1
|
تاریخ :
1404/01/24
- ساعت :
07:09:00 AM
- بازدید :
129
- پاسخ :
0
|