#multithreading #progress-bar #caliburn.micro
#многопоточность #индикатор выполнения #caliburn.micro
Вопрос:
Я продолжаю читать, насколько хорош Caliburn в маршалировании потоков и как невероятно легко обновлять поток пользовательского интерфейса, но, похоже, я не могу заставить его работать и не могу найти пример, который показывает это, поэтому мне нужна помощь…
Вот мой XAML…
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<Label Content="Progress For Current File" />
<WrapPanel>
<ProgressBar x:Name="CurrentFileProgress" Width="500" Height="25" Minimum="0" Maximum="1" />
<Label Content="1 of 25" />
</WrapPanel>
</StackPanel>
Вот моя ViewModel…
public void Go()
{
var files = Directory.GetFiles(PathToFiles, "*.sql");
CurrentFileProgress = 0;
for (int iter = 1; iter <= files.Length; iter )
{
CurrentFileProgress = iter / (files.Length * 1.0f);
System.Threading.Thread.Sleep(250);
}
}
private double _CurrentFileProgress = 3; //For design time look
public double CurrentFileProgress
{
get { return _CurrentFileProgress; }
set
{
_CurrentFileProgress = value;
NotifyOfPropertyChange(() => CurrentFileProgress);
}
}
Это достаточно просто, и через несколько секунд мой индикатор выполнения равен 100%, но он не работает так, как я ожидал.
Ответ №1:
Я думаю, проблема в том, что при вызове Thread .Sleep вы блокируете поток пользовательского интерфейса, поэтому пользовательский интерфейс не может быть обновлен до завершения действия. Попробуйте запустить процесс в фоновом потоке (или используйте TPL — задачи).
Комментарии:
1. Вчера поздно вечером я обнаружил ошибку на своем пути, прежде чем прочитать ваш ответ. Проблема заключалась в том, что мой цикл for находился в потоке пользовательского интерфейса, и как только я поместил цикл for в отдельный, используя TPL, как вы предложили, это сработало как шарм.