【发布时间】:2018-05-11 08:01:43
【问题描述】:
我正在用 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;
}
上面是另一个类的代码,该方法作为参数控件提供。 我做错了什么?
【问题讨论】:
-
程序甚至没有调用这个方法。当我使用 Task.Run() 在此方法中设置断点时,程序甚至没有进入此方法。
-
请记住,UI 元素不是线程安全的。您是否尝试过改用
ThreadPool.QueueUserWorkItem();?