Я создаю приложение, использующее TPL в VS2010 Ultimate. В большинстве случаев, когда я запускаю приложение, он становится невосприимчивым, когда я вызываю DoRepresentation() из потока пользовательского интерфейса.Тупик с использованием Control.Invoke?
void DoRepresentation()
{
Parallel.ForEach(cgs, loopOptions, g =>
{
UpdateRepresentation(g);
});
}
void UpdateRepresentation(object g)
{
view.Invoke(new Action(() =>
{
representation = new MyRepresentation(g);
}));
}
Я не знаю, почему приложение становится невосприимчивым. Есть ли у меня тупик?
Внутри MyRepresentation Я звоню в OpenGL.
вид - это элемент управления внутри формы1 (основная форма).
Когда приложение перестает отвечать на запросы приостановить его с VS IDE и вот информацию я получить
В «Параллельные задачи» окно я получаю следующее:
ID Status Message<br>
1 ?Waiting Task1 is waiting on object: "Task2"<br>
2 ?Waiting No waiting information available<br>
В окно "Call Stack" я получаю следующее:
[In a Sleep, wait, or join]<br>
[External Code]<br>
Test.dll!Render.DoRepresentation()<br>
App1.exe!Form1.Button1_Click<br>
Любая помощь будет apprec iated.
Не можете ли вы использовать 'BeginInvoke', а не' Invoke'? – Nick
Нет, потому что мне нужно блокировать до возврата UpdateRepresentation(). Потому что после Parallel.ForEach() я делаю некоторые другие вызовы для некоторых методов. – Michelle
Может быть, глупый вопрос, но у View есть Диспетчер, чтобы вы могли делать view.Dispatcher.Invoke()? – Davio