일반적인 루틴, 진행률 표시 줄, 사용자가 버튼을 클릭하면 프로세스가 실행되고 진행률 표시 줄이 업데이트됩니다. 권위 있는.
그러나 전체 앱이 시작되는 순간 프로세스를 실행하고 싶으므로 Loaded
핸들러 에서 실행합니다 Window
(내 앱의 유일한 창).
이제 진행률 표시 줄이 업데이트되지 않습니다. 이 문제를 극복하는 방법?
진행률 표시 줄을 업데이트하는 테스터입니다.
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(100);
Progress.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Render, new Action(delegate() { ++Progress.Value; }));
}
당신은을 업데이트하는 데 사용되는 UI 스레드에 모든 작업을 넣어 때문에 Progressbar
이 때문에, Progressbar
작업이 완료 될 때까지 업데이트되지 않습니다. 백그라운드 스레드에서 작업을 넣어 및 업데이트 Progressbar
사용하여 백그라운드 스레드에서 Dispatcher.BeginInvoke
.
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(100);
Progress.Dispatcher.BeginInvoke(new Action(delegate() { ++Progress.Value; }), null);
}
});
}
.NET 2.0 (TPL을 사용하지 않음)을 사용하는 경우 ThreadPool
,
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
ThreadPool.QueueUserWorkItem( (o) =>
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(100);
Progress.Dispatcher.BeginInvoke(new Action(delegate() { ++Progress.Value; }), null);
}
});
}
또는 await-async
(.NET 4.5)를 사용하여 .NET으로 DoWork()
표시된 모든 메서드에서 호출 할 수 있습니다 async
.
async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
await DoWork();
}
async Task DoWork()
{
await Task.Run(async () =>
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(100);
await Progress.Dispatcher.BeginInvoke(new Action(delegate() { ++Progress.Value; }), null);
}
});
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다