Обновление панели выполнения с помощью Caliburn Micro

#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, как вы предложили, это сработало как шарм.