2012-10-08 60 views
4

我有一大堆的方法的類。例如如何使用同一類的多線程在C#

 private int forFunction(String exceptionFileList, FileInfo z, String compltetedFileList, String sourceDir) 
     { 
      atPDFNumber++; 
      exceptionFileList = ""; 
      int blankImage = 1; 
      int pagesMissing = 0; 

      //delete the images currently in the folder 
      deleteCreatedImages(); 
      //Get the amount of pages in the pdf 
      int numberPDFPage = numberOfPagesPDF(z.FullName); 

      //Convert the pdf to images on the users pc 
      convertToImage(z.FullName); 

      //Check the images for blank pages 
      blankImage = testPixels(@"C:\temp", z.FullName); 

      //Check if the conversion couldnt convert a page because of an error 
      pagesMissing = numberPDFPage - numberOfFiles; 
} 

現在什麼即時通訊正試圖進行訪問的線程類..但不只是一個線程,也許大約有5個線程來加速處理,因爲一個線程有點慢。

現在我的腦海裏,這將是混亂...我的意思是一個線程更改變量,而另一個線程忙於他們等等,並鎖定每一個變量在所有這些方法...不去有一個良好的時間...

那麼IM的提出,和不知道它的正確方法..這是

public void MyProc() 
    { 
     if (this method is open, 4 other threads must wait) 
    { 
     mymethod(var,var); 
    } 
    if (this method is open, 4 other threads must wait and done with first method) 
    { 
     mymethod2(); 
    } 
    if (this method is open, 4 other threads must wait and done with first and second method) 
     { 
      mymethod3(); 
    } 
     if (this method is open, 4 other threads must wait and done with first and second and third method) 
     { 
      mymethod4(); 
     } 
    } 

這將是接近多線程的訪問問題的正確方法多個方法在同一時間?

那些線程只會訪問Class 5次,不會再有,因爲工作負載將被平分。

+0

您對術語的混合確實沒有幫助。你不會運行一個類,也不會有一種被稱爲'myClass'的方法。如果你能舉一個更具體的例子,它會有所幫助... –

+0

正在更新它。 Thanx – Ruan

+0

如果您要定位特定語言,請將其作爲您問題的標記。現在我添加了「java」標籤,因爲代碼看起來像Java。 –

回答

5

是的,這是您的選擇之一。你擁有的條件表達式,但是,應該使用lock語句,甚至是更好的替代,使該方法同步:

[MethodImpl(MethodImplOptions.Synchronized)] 
private int forFunction(String exceptionFileList, FileInfo z, String compltetedFileList, String sourceDir) 

這是不是一個真正的條件,因爲沒有什麼條件會在這裏。下一個線程必須等待,然後它必須繼續。它在沒有執行任何指令的情況下就會睡覺,然後從外面被喚醒。

另請注意,當您擔心在並行執行非同步方法期間變量混淆時,這僅適用於成員變量(類字段)。它不適用於方法中聲明的局部變量,因爲每個線程都有自己的副本。

+0

我不敢相信這工作得如何。 謝謝。 – Ruan

+1

@Ruan Me too。因爲你的標籤是c#,但答案中的例子是java(儘管差異很小)。 –

+0

酷酷。謝謝 – Ruan