【发布时间】:2015-07-28 01:40:46
【问题描述】:
我正在 VS2010 Ultimate 中使用 TPL 构建应用程序。大多数情况下,当我从 UI 线程调用 DoRepresentation() 时,我运行该应用程序时它会变得无响应。
void DoRepresentation()
{
Parallel.ForEach(cgs, loopOptions, g =>
{
UpdateRepresentation(g);
});
}
void UpdateRepresentation(object g)
{
view.Invoke(new Action(() =>
{
representation = new MyRepresentation(g);
}));
}
我不知道为什么应用程序变得无响应。我遇到了僵局吗?
在 MyRepresentation 内部我对 OpenGL 进行了一些调用。
view 是 Form1(主窗体)内的一个 Control。
当应用程序变得无响应时,我从 VS IDE 暂停它,这是我得到的信息
在“并行任务”窗口中,我得到以下信息:
ID Status Message<br>
1 ?Waiting Task1 is waiting on object: "Task2"<br>
2 ?Waiting No waiting information available<br>
在“调用堆栈”窗口中,我得到以下信息:
[In a Sleep, wait, or join]<br>
[External Code]<br>
Test.dll!Render.DoRepresentation()<br>
App1.exe!Form1.Button1_Click<br>
我们将不胜感激。
【问题讨论】:
-
你不能用
BeginInvoke而不是Invoke吗? -
否,因为我需要阻止直到 UpdateRepresentation() 返回。因为在 Parallel.ForEach() 之后,我对某些方法进行了其他调用。
-
也许是个愚蠢的问题,但是 View 是否有 Dispatcher 以便您可以执行 view.Dispatcher.Invoke()?
-
MyRepresentation的构造函数需要在UI线程上调用吗? -
一个类似的问题(和可能的解决方案)已经发布在这里:stackoverflow.com/questions/3467816/…
标签: c# winforms task-parallel-library