填充数组时出现System.InvalidOperationException错误

时间:2018-08-29 14:19:35

标签: c# wpf progress-bar

因此,我有一个可用作控制台应用程序UI的程序。我试图添加一个进度条。当用户单击this.$store.commit('setValue', { item: 'myvalue', newValue: 'newtest' })按钮时,它会执行以下操作:

Start

这是为了在GUI程序正常工作并提供控制台程序时更新进度条。程序开始像这样填充名为MainProgress.Value = 0; MainProgress.Maximum = PackageNwCheckbox.IsChecked == true ? 4 : 3; BackgroundWorker compilerWorker = new BackgroundWorker(); compilerWorker.WorkerReportsProgress = true; compilerWorker.DoWork += StartCompiler; compilerWorker.ProgressChanged += CompilerReport; compilerWorker.RunWorkerAsync(); 的数组时:

filemap

应用程序崩溃,错误提示

  

调用线程无法访问该项目,因为另一个线程拥有它。

2 个答案:

答案 0 :(得分:1)

在具有后台线程的桌面应用程序中,如果您尝试更新视图。您将需要使用调度程序来调用该更新。在您的CompilerReport方法中,您需要这样的东西:

MainProgress.Dispatcher.Invoke(() =>
{
    // Do update here
});

使用更多代码,我可能可以详细说明一个更好的答案

答案 1 :(得分:1)

您无法从后台线程访问ProjectLocation.Text。您只能在最初创建UI线程的线程上访问UI控件的成员。

因此,如果要在ProjectLocation事件处理程序中使用DoWork的当前文本,则应使用分派器:

string location = Dispatcher.Invoke(() => ProjectLocation.Text);
filemap = Directory.GetFiles(location + "\\www\\js\\", "*.js");

或将其作为参数传递给RunWorkerAsync方法。