Вызвать и задача не работает - PullRequest
0 голосов
/ 11 мая 2018

Я пишу программу на C #, и у меня есть проблема, я хочу обновить Label и ProgressBar при просмотре из метода, который находится в другом классе после каждого цикла.Однако эти элементы управления обновляются не после каждого цикла, а в конце метода.Как это решить?Task.Run (() => methodFromAnotherClass ()) не работает вообще, и когда я использую Invoke.Dispatcher и когда я передаю элементы управления в качестве параметров методу, обновление происходит только в конце метода, ине после каждого цикла.

private void buttonStart_Click(object sender, RoutedEventArgs e)
{
    FindDocument findDocument = new FindDocument(labelCurrentNumber, progressBar1);
    cProgress<int> progress = new Progress<int>();
    progress.ProgressChanged += (p, value) => { progressBar1.Value = value; labelCurrentNumber.Content = value.ToString(); };
    //Task.Run(() => findDocument.Find(csvRows, mode, (int)slider.Value, 1, check, progress, outputFileCsv));
    findDocument.Find(csvRows, mode, (int)slider.Value, 1, 1, progress, outputFileCsv);
}

Выше приведен код из поля зрения.

public int Find(List<CsvModel> csvRows, SearchMode PageMode, int PageMargin, double sensitivity, int pageInfo, IProgress<int> progress, string outPath)
{
    csvContent.AppendLine("sep=,");
    csvContent.AppendLine("Lp,Plik wejściowy, Plik wyjściowy, Wynik");

    foreach (CsvModel csv in csvRows)
    {
        progressReport++;
        progress.Report(progressReport);

        lab.Dispatcher.InvokeAsync(() => lab.Content = progressReport.ToString());
        this.lab.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => lab.Content = progressReport));
    }
    File.WriteAllText(outPath + @"\dane.csv", csvContent.ToString());
    logger.Info($"Zakończono przetwarzanie obrazu");
    return 0;
}

Выше приведен код из другого класса, который метод предоставляет в качестве параметров управления.Что я делаю не так?

1 Ответ

0 голосов
/ 11 мая 2018

Если вы запускаете это синхронно (как в настоящее время), пользовательский интерфейс блокируется до конца метода, поэтому вы не видите изменения прогресса.

Если вы используете Task, вы, вероятно, получите ошибку, потому что я не верю, что progress.ProgressChanged является поточно-ориентированным.Вы можете использовать Dispatcher.Invoke или Contorl.Invoke при сообщении о прогрессе ( progress.Report(progressReport);) или в самом событии (progressBar1.Value = value; labelCurrentNumber.Content = value.ToString();)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...