VS2010上的stacktrace

问题描述:

private void ParallelCrashTest() 
{ 

    for (int x = 0;x < 100; x++) 
    { 
     Dowork_1(i); 
    } 
} 

private void Dowork_1(int i) 
{ 
ThreadInfo threadInfo = new ThreadInfo(); 
threadInfo.first = 0; 
threadInfo.last = 100; 
for (int x = 0;x < 60; x++) 
    { 
     Dowork_2(threadinfo); 
     progressBar2.Value = x + 1; 
    } 
} 
private void Dowork_2(object param) 
{ 

    ThreadInfo threadInfo = param as ThreadInfo; 
    int first = threadInfo.first; 
    int last = threadInfo.last; 
    Parallel.For(first, last, i => 
    { 

     didsomthing... 

    } 

    Update(); 

} 

所以它不起作用。 (CPU正在工作90-100%,这意味着我仍然在工作我的应用程序) 我用更新()而不是Application.DoEvent()。我的应用程序崩溃或无法更新()。我不知道 。我认为这可能是问题是更新(),但我不知道。你有什么建议吗? 谢谢。VS2010上的stacktrace

+2

什么是“didsomthing?”我敢打赌,无论是什么原因造成这种情况都会发生。可能试图更新GUI。 – Aaronaught 2010-02-28 19:50:38

+2

@失败巨魔失败。我也很喜欢“我的应用程序崩溃HURR”问题,*无例外详情*。就像我们可以挥动魔杖一样,知道为什么会有东西坠毁。此外,Application.DoEvents在多线程应用程序?盖伊需要坐下来写一本好书并学习。 – Will 2010-02-28 20:08:17

+0

@威尔:你的意思是你*不要*有一个魔术调试棒?我支付了我的最高美元,但它是值得的,没有更多讨厌的应用程序崩溃! – Aaronaught 2010-02-28 21:15:27

以什么方式崩溃?

我的猜测是,您正尝试从另一个线程更新GUI,例如更新进度栏。要做到这一点,你必须使用Invoke

如果您可以提供一个简约但完整的编译代码的简单但完整的示例来重现错误,以便我们不必猜测,这将会非常有用。你可以通过将你的项目复制到一个新的文件夹中,并删除不必要的文件,类,方法和行来做到这一点,直到在再现错误时无法删除更多行。

+0

其实当我使用示例“For”循环它很好,但它需要很长时间。所以我需要缩短时间。我只是改变了“Parallel.For”而不是“For”循环。我认为didsomething是无关紧要它使用“for”循环 – tonyontlga 2010-02-28 20:01:47

+0

@tonontlga:当你使用'for'它运行在同一个线程中。 'Parallel.For'被允许使用许多不同的线程。我认为你的问题是你正在更新并行中的GUI,但它也可能与线程有关。你没有提供足够的代码来确定问题所在。尝试制作一个可编译且可运行的最简化示例,以重现错误并将其发布。 – 2010-02-28 20:04:27

+0

是的,我正在使用进度条。我的应用程序正在工作几分钟突然它崩溃了,我的意思是程序的所有活动时间的中间。:) – tonyontlga 2010-02-28 20:04:53

Update()方法和progressBar2.Value赋值都不是从工作线程合法的。它不会使Visual Studio崩溃,即使是VS2010,你也会得到一个简单的IllegalOperationException,告诉你你做的事情不合适。

您需要使用Control.Invoke()方法。我在链接的MSDN文章中有一个很好的例子。

+0

是的,我用工作线程。这就像解决方法过程。但是在“paralle.for”循环中需要很长时间。这就是为什么它不好。我必须安排时间表。 – tonyontlga 2010-02-28 20:39:53