2012-02-02 154 views
-5

此代碼(對不起,這個可怕的代碼):管理和控制線程

int count = 0; 
while (true) 
{ 
    if (count < 3) 
    { 
     try 
     { 
      ac = acci.Pop(); 
     } 
     catch 
     { 
      break; 
     } 
     if (ac != "") 
     { 
      ++count; 
      new Thread(delegate() 
         { 
         Console.WriteLine("Run " + ac.Name); 
         Go(ac); 
         --count; 
         }).Start(); 
     } 
    } 
} 

在圍棋()我使用WebClient的。當我運行它時,同一個線程運行更多1次,但這不應該發生。 ac - String,count - Int,在Go()Webclient下載頁面中,解析一些標記並將標記值保存在文件中。需要同時運行3個線程。

+0

@harungo - 不清楚問題是什麼,或者你希望它做什麼。你可以嘗試重新輸入這個問題,這樣會更清楚一點嗎? – DanTheMan 2012-02-02 17:28:04

+0

我知道..我被他大膽的陳述諷刺。 – MethodMan 2012-02-02 17:28:29

+0

ac是什麼?在其中一個地方,您將其與字符串進行比較,您可以使用屬性Name來覆蓋它。 – 2012-02-02 17:29:50

回答

1

我看到的只是改變數的定義,最簡單的變化:

volatile int count = 0; 

這使得不同的線程都使用相同的「廉政」的變量,而沒有它,他們可能有不同的副本。

但是,我想你需要更多的改變。 Int不適用於線程同步。這是什麼信號量:

Semaphore sem = new Semaphore(3,3); 
while (acci.Count > 0) 
{ 
    ac = acci.Pop(); 
    if (ac != "") 
    { 
     new Thread(delegate() 
        { 
        sem.WaitOne(); 
        Console.WriteLine("Run " + ac.Name); 
        Go(ac); 
        sem.Release(); 
        }).Start(); 
    } 
} 

請小心!我們可以在那裏創建很多線程!如果你的系統一次可以得到很多請求,你可能需要將WaitOne移到新線程之外(...)。

您可能還想看看ThreadPool類和BackgroundWorker類,具體取決於您的環境。

+0

問題:如何在這個線程中使用寫入流(在同一個文件中寫入)? – harungo 2012-02-02 18:00:19

+0

http://stackoverflow.com/questions/5104393/c-sharp-sharing-file-handles-across-threads – DanTheMan 2012-02-02 19:20:50

0

我不知道你的事情是什麼,但你有while(true){}這是一個無限循環。它只會在您的交流變量分配中出現異常。這不好。不要使用try/catch來實現應用程序邏輯。產生一個異常是你的代碼的一個大交易。你應該使用if/else語句來處理這類事情。例如

if (acci.length == 0) 
{ 
    break; 
} 
else 
{ 
    ac = acci.Pop(); 
} 

那說,我不知道你想在這裏做什麼,但多線程是危險的。即使您的計數分配正確,您的線程也會面臨一些風險。

+0

變量「acci」是Stack,他不支持Length。 – harungo 2012-02-02 17:30:40

+0

很多東西都有TryPop()或Peek()等等。儘管如此,總有一種方法可以告訴我們是否有什麼東西可以流行。 – DanTheMan 2012-02-02 17:30:42

+0

@harungo Stack有一個計數 – DanTheMan 2012-02-02 17:31:30