موضوع : نمایش یک 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
چه کاری باید انجام بدم ؟
لطفا راهنمایی بفرمایید
باتشکر از همگی
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
346
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
309
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4263
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4279
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3874
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
654
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3169
- پاسخ :
2
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
54
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
93
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|