2015-04-01 33 views
0

我有一個問題,在vb.net誤會線程如何工作

首先我想告訴大家,我沒有線程之前(只是在學校)工作的大問題,線程,我讀了很多關於它的網頁,但沒有一個可以幫我解決我的問題。

這裏我的主要問題是理解邏輯,如果有可能,解決我有的問題,都是相關的,然後我會解釋這個問題。

的代碼有沒有相關的評論和/或文檔,並且是很多年前制定一項方案,這樣做是不工作在辦公室的傢伙,沒有人知道它是如何工作的:S

我有一個名爲listOfProccess的列表,何時只有1個工作正常。

在回調函數

QueueUserWorkItem填寫關於p的信息,然後執行線程,我想

該列表包含與信息類型

listOfProccess[].type = 'a/b/c/d/e/f/g/' 

陣列還列表包括一個ID。

代碼:

If listOfProccess.Count > 0 Then 

    Threading.ThreadPool.SetMinThreads(1, 1) 

    Threading.ThreadPool.SetMaxThreads(4, 4) 


    For Each p In listOfProccess 
     Try 

      Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(Object p.function)) 


     Catch e As Exception 
      sendMail("[email protected]", "[email protected]", "", e.StackTrace) 
     End Try 
    Next 

問題: 我這裏有兩個問題:

  1. 有時執行列表中即一個項目 'A' 的無限循環,和消費的所有資源機器,但如果我關閉並重新啓動,工作,我不知道如果是與線程的問題或不真實,我認爲這是其他的事情,因爲這個問題開始兩週或前幾周,程序仍然在一年中運行。

  2. 這一個我認爲是與有關線程,如果我有兩個(或更多)的名單像這樣的號碼:

    p[1].type = 'a/b/c/d/e/f/g/' p[1].ID = 1

    p[2].type = 'ww/xx/ff/yy/aa/rr/' p[2].ID =2

當系統執行這樣的事情時,它遵循的方式是「隨機的」,即。需要第一個,a, b,c之後,它確實ww,並回到第一個。如果我在列表中有更多項目,比如4或5,則問題更大;這不是一個很大的問題,因爲程序起作用,它不是100%正常工作,而是工作,更多的是試圖理解爲什麼它在這種方式下工作。

任何幫助,歡迎。

+0

聽起來可能很刺耳,但最好的選擇是刪除所有內容並重新開始。您需要評估程序必須做的所有事情以及如何完成,即使您認爲自己掌握了所有東西,但只要您不期望,其他人的代碼就會失敗。無論如何,祝你好運,你會需要它。 – 2015-04-01 10:57:41

+0

@EduardoSoriano從0開始並不是一個有效的選項,它是一個非常龐大而複雜的項目,開發了幾個月。 – TiGreX 2015-04-01 11:55:00

+0

防火線穿線永遠不是問題。當太陽正在閃閃發光時,它會起作用,並且你的背部有風。但它總是遲早會下雨。您需要做更多的工作來診斷真正的問題,至少您需要添加跟蹤,以便了解發生了什麼。 – 2015-04-01 12:11:27

回答

1

第二個問題是race condition問題,因爲您無法保證線程的執行順序,您的線程將會取代彼此的值的概率非零。解決這個問題有許多方法:algorythms(鎖定鎖和無鎖鎖),同步技術等等,並且沒有解決方案。

第一個問題對我來說還不清楚,因爲我不明白你的意思是什麼a infinite loop - 可能會發生這種情況,如果你將項目鏈接刪除(從其他線程),並且沒有辦法出去您的任務,因爲列表中的鏈接已損壞。這仍然應該用同步來解決。

我認爲你應該從MSDN文章或一些關於多線程的書籍開始,在此之後,你應該一步一步地分解你的程序,瞭解你理解的小部分。

更新:

p.function - 關於無限循環,你應該考慮這個委託的代碼。如果有重啓工作的條件,您應該檢查遞歸限制。例如,如果有an optimistic locking algorythm,您的代碼可以發現它所嘗試的更新無效,並且重新啓動它。如果鏈接被破壞,它將永遠不會結束它的任務,並將永遠停留在無限循環中。

+0

感謝第一個問題,當我執行A並完成時,我會看一下關於第二個關於「無限循環」的內容,然後重新開始,不知道我是否正確解釋了這個問題。是的,我必須研究多線程。謝謝。 – TiGreX 2015-04-01 10:14:55

+0

@TiGreX更新了答案,嘗試調查'p.function' - 我認爲問題在那裏。 – VMAtm 2015-04-01 10:51:39

相關問題