Я новичок в WPF и параллельной обработке. Я преобразовал простую программу из консольного приложения в WPF. Есть несколько функций, которые я хочу выполнять параллельно. Код ниже отлично работает в консольном приложении.
long primeP;
string[] arrIDsP = null;
string[] arrNamesP = null;
string[] arrMergedP = null;
Parallel.Invoke(
() => primeP = this.FindPrimeNumber(Convert.ToInt64(txtPrime.Text)),
() => arrIDsP = this.FetchData(@txtFilePath1.Text),
() => arrNamesP = this.FetchData(@txtFilePath2.Text));
arrMergedP = this.MergeIDToNameP(arrIDsP, arrNamesP);
Когда я использую то же самое в WPF, я получаю исключение:
Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток.
Поэтому я использовал Dispather.Invoke в соответствии с предложениями в других сообщениях Stackoverflow.
Parallel.Invoke(
() => primeP = this.FindPrimeNumber(this.Dispatcher.Invoke(() => Convert.ToInt64(txtPrime.Text))),
() => arrIDsP = this.FetchData(this.Dispatcher.Invoke(() => @txtFilePath1.Text)),
() => arrNamesP = this.FetchData(this.Dispatcher.Invoke(() => @txtFilePath2.Text)));
arrMergedP = this.MergeIDToNameP(arrIDsP, arrNamesP);
Теперь проблема в том, что мой код бесконечно застревает внутри Parallel.Invoke. После поиска я наткнулся на эту ссылку: ?forum=csharplanguage" rel="nofollow noreferrer">Невозможно использовать Dispatcher.Invoke в Parallel.Invoke, и это похоже на тупиковую ситуацию.
Я знаю, что могу присвоить значения текстового поля отдельным переменным и передать их в качестве параметров, а затем использовать Parallel.Invoke, но что было бы обходным путем, если бы я не использовал переменные?
Может ли кто-нибудь предложить правильный способ решить эту проблему?