Я выполняю тяжелую фоновую работу с Parallel.Invoke, после того как вся обработка завершена, я возвращаю метод, возвращаюсь снова, вызываю следующий метод, чтобы использовать вычисленные данные, я получаю ошибку:
Недопустимая операция между потоками: доступ к элементу управления '' осуществляется из потока, отличного от потока, в котором он был создан.
Но я уже вернулся из потоков, которые были созданы Parallel.Invoke, к тому, который вызвал его в первую очередь. Это нормально, что управление не возвращается к потоку, где оно началось? И как я могу гарантировать, что это произойдет?
Код:
public void TopMethod()
{
Calculate(4);
UpdateGui();
}
public void Calculate(int depth)
{
Recursive(depth);
}
public void Recursive(int depth)
{
if (depth > 0)
System.Threading.Tasks.Parallel.Invoke(
delegate { Recursive(depth - 1); });
}
public void UpdateGui()
{
CalculateOhter(); // Works fine.
controlElement.Focus(); // Causes exception
}
Изменения:
Я знаю о Control.Invoke Но это было бы уродливым решением (не хочу хранить делегат в каждом элементе управления), и программе нужно дождаться завершения всех вычислений, прежде чем она сможет продолжить. Поэтому было бы лучше, если бы я мог каким-то образом заставить управление вернуться к тому потоку, с которого я начал.