2010-02-28 70 views
0
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

回答

2

以什麼方式崩潰?

我的猜測是,您正嘗試從另一個線程更新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

1

Update()方法和progressBar2.Value賦值都不是從工作線程合法的。它不會使Visual Studio崩潰,即使是VS2010,你也會得到一個簡單的IllegalOperationException,告訴你你做的事情不合適。

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

+0

是的,我用工作線程。這就像解決方法過程。但是在「paralle.for」循環中需要很長時間。這就是爲什麼它不好。我必須安排時間表。 – tonyontlga 2010-02-28 20:39:53