VS2010上的堆栈跟踪

时间:2010-02-28 19:44:30

标签: c#

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%,这意味着我猜我还在使用我的应用程序)  我使用Update()而不是Application.DoEvent()。我的应用程序崩溃或无法更新()。我不知道 。我认为可能是问题是Update()但我不确定。你有什么建议吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

以什么方式崩溃?

我的猜测是你试图从另一个线程更新GUI,比如更新进度条。为此,您必须使用Invoke

如果你能提供一个简化但完整的编译代码的简单但完整的例子来重现错误,这样我们就不必猜测了。您可以通过将项目复制到新文件夹并删除不必要的文件,类,方法和行来执行此操作,直到仍然无法删除任何其他行,同时仍然可以再现错误。

答案 1 :(得分:1)

Update()方法和progressBar2.Value赋值都不属于工作线程。它不会崩溃Visual Studio,甚至VS2010都不会崩溃,你会得到一个简单的IllegalOperationException来告诉你你正在做一些不正确的事情。

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