У меня есть один поток, который генерирует элементы GUI в wpf. Холст есть рисовать объекты (прямоугольники и так далее ...)Task.Factory и связь между потоками
Это МОФ нити называет другой поток давайте назвать это расчета нити. Этот поток вычисляет размер и положение и т. Д. Элементов, которые будут отображаться на холсте.
Я хочу, чтобы эти две части (GUI и calculatio) выполнялись в разных потоках. «Поток вычислений» основан на библиотеке без ссылок на функциональность wpf.
Теперь я хочу показать промежуточные данные потока вычислений, отображаемого потоком wpf. Я делаю это таким образом:
известково-нить пожары событие (DataReady), реализуемый МОФ-нить:
void MyRegStringObject_DataReady()
{
if (DebugMode)
MyDrawingBoard.DrawRegElements();
}
Проблема теперь в том, что выдается ошибка: «вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток»
Есть несколько ответов на этот вопрос в stackoverflow, ссылающихся на эту ошибку, но ни один из них не может помочь в моем случае.
Функция DrawRegElements() хочет, чтобы очистить объект холста (между прочим):
curCanvas.Children.Clear();
В этом положении в коде выбрасывается ошибка. Похоже, что функция MyRegStringObject_DataReady, инициированная событием из потока calc, также выполняется потоком calc. Но в классе определяется, что на основе wpf-потока.
Как я могу решить эту проблему? Кто-нибудь есть идеи? Кстати: известково-нить не называется так:
CalcElements = Task.Factory.StartNew<bool>(MyRegStringObject.CalcRegElements);
Когда поток завершается я определил:
CalcElements.ContinueWith((FinishCalcRegElements) =>
{
MyDrawingBoard.DrawRegElements();
}, CancellationToken.None, TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
Нет проблем с этим. Everythins работает идеально. Функция, определенная в ContinueWith, кажется, была обработана wpf-нитью.
, когда вы говорите 'Dispatcher.Current', вы имеете в виду [Dispatcher.CurrentDispatcher] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.currentdispatcher.aspx), правильно? Я предполагаю, что MyDrawingBoard - это какой-то элемент управления WPF, так что «MyDrawingBoard.Dispatcher.BeginInvoke» будет в порядке. – Clemens
Право 'CurrentDispatcher', исправлено. Вы пробовали это? – sll
@ sll Dispatcher.CurrentDispatcher.BeginInvoke действительно не работает, я не знаю, почему, но UI-поток получает событие, запущенное рабочим потоком, но DrawRegElements не вызывается. Он вызывается только в конце (когда рабочий поток завершен). – manton