因此,我有一个可用作控制台应用程序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
应用程序崩溃,错误提示
调用线程无法访问该项目,因为另一个线程拥有它。
答案 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
方法。