Ошибка System.InvalidOperationException при заполнении массива - PullRequest
0 голосов
/ 29 августа 2018

Итак, у меня есть программа, которая работает как пользовательский интерфейс для консольного приложения. Я попытался добавить индикатор выполнения к этому. Когда пользователь нажимает кнопку Start, он делает это:

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();

Это для того, чтобы обновить индикатор выполнения, когда программа GUI работает и передает консольную программу. Когда программа начинает заполнять массив с именем filemap следующим образом:

filemap = Directory.GetFiles(ProjectLocation.Text + "\\www\\js\\", "*.js");
//The variable is an array of strings.

Приложение вылетает и появляется сообщение об ошибке

Поток вызовов не может получить доступ к элементу, потому что он есть у другого потока.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы не можете получить доступ к ProjectLocation.Text из фонового потока. Вы можете получить доступ только к элементам пользовательского интерфейса в том потоке, в котором он был изначально создан.

Так что если вы хотите, чтобы текущий текст ProjectLocation в вашем DoWork обработчике событий, вы должны использовать диспетчер:

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

Или передать его в качестве аргумента методу RunWorkerAsync.

0 голосов
/ 29 августа 2018

В настольных приложениях с фоновыми потоками, если вы пытаетесь обновить представление. Вам нужно будет вызвать это обновление у диспетчера. Где-то в вашем CompilerReport методе вы хотите что-то вроде этого:

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

С большим количеством кода я мог бы, вероятно, детализировать лучший ответ

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