موضوع : نمایش یک 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
چه کاری باید انجام بدم ؟
لطفا راهنمایی بفرمایید
باتشکر از همگی
تاریخ :
1403/12/23
- ساعت :
03:14:00 PM
- بازدید :
135
- پاسخ :
1
|
تاریخ :
1403/12/22
- ساعت :
11:05:00 AM
- بازدید :
187
- پاسخ :
1
|
تاریخ :
1399/11/25
- ساعت :
11:22:00 AM
- بازدید :
3896
- پاسخ :
2
|
تاریخ :
1403/12/02
- ساعت :
12:09:00 AM
- بازدید :
270
- پاسخ :
1
|
تاریخ :
1398/07/08
- ساعت :
12:21:00 AM
- بازدید :
3048
- پاسخ :
2
|
تاریخ :
1403/11/23
- ساعت :
08:24:00 PM
- بازدید :
191
- پاسخ :
2
|
تاریخ :
1399/11/10
- ساعت :
10:01:00 PM
- بازدید :
7167
- پاسخ :
4
|
تاریخ :
1399/04/09
- ساعت :
08:51:00 PM
- بازدید :
3094
- پاسخ :
1
|
تاریخ :
1399/03/25
- ساعت :
08:58:00 PM
- بازدید :
3825
- پاسخ :
1
|
تاریخ :
1398/10/03
- ساعت :
10:47:00 PM
- بازدید :
5336
- پاسخ :
8
|
تاریخ :
1404/01/07
- ساعت :
05:02:00 AM
- بازدید :
89
- پاسخ :
1
|
تاریخ :
1402/04/28
- ساعت :
09:04:00 PM
- بازدید :
1313
- پاسخ :
0
|
تاریخ :
1403/12/30
- ساعت :
06:43:00 PM
- بازدید :
66
- پاسخ :
1
|
تاریخ :
1398/08/23
- ساعت :
09:16:00 PM
- بازدید :
9852
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
12:18:00 PM
- بازدید :
37
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
10:39:00 AM
- بازدید :
45
- پاسخ :
1
|
تاریخ :
1404/01/02
- ساعت :
05:05:00 PM
- بازدید :
59
- پاسخ :
1
|
تاریخ :
1403/12/30
- ساعت :
06:52:00 PM
- بازدید :
48
- پاسخ :
1
|
تاریخ :
1399/06/04
- ساعت :
02:25:00 PM
- بازدید :
4419
- پاسخ :
2
|
تاریخ :
1403/11/30
- ساعت :
10:36:00 AM
- بازدید :
202
- پاسخ :
2
|