2014-01-23 57 views
0

我有以下代碼:類和線程

public class Search 
{ 
    StringBuilder sb = new StringBuilder(); 
    string[] myparams; 

    public void Start() 
    { 
     //Start search threads 
     for (int i = 0; i < 50; i++) 
     { 
      tasks.Add(Task.Factory.StartNew(() => 
      { 
       string text1 = GetFirstRequest(url, myparams); 
       string text2 = GetFirstRequest(url, myparams); 

      }, ct, TaskCreationOptions.LongRunning, TaskScheduler.Default)); 
     } 
    } 

    private string GetFirstRequest(string url, string[] myparams) 
    { 
     //Use stringbuilder to build the complete url with params 
     //Use webrequest, response and stream to return the url contents 
    } 

    private string GetSecondRequest(string url, string[] myparams) 
    { 
     //Similar to GetFirstRequest 
    } 
} 

對於我的主要形式我打電話:

Search search = new Search(); 
search.Start(); 

正如你可以從上面的代碼中看到,創建單獨的線程。但是,每個線程都正在調用Search類中的相同私有函數以訪問該URL。

代碼是線程安全的嗎?將私有函數放入單獨的類併爲每個線程創建一個類會更好嗎?

+0

誰知道?我們應該看看那些功能裏面有什麼。如果他們訪問(寫作)班級成員,那麼他們可能不安全... –

+0

真的不清楚你在做什麼。你爲什麼要旋轉50個全部調用'GetFirstRequest'的線程? – Sean

+0

'url'和'params'來自任何地方,'StringBuilder sb'的用法還不清楚。所以_「代碼是否線程安全?」非常不可信。 –

回答

2

沒有看到實際的代碼GetFirstRequestGetSecondRequest,我們不能告訴 - 但事實上,你有StringBuilder類型的實例可變讓我持懷疑態度。 StringBuilder本身不是線程安全的,如果你在多線程中修改單個對象,我懷疑你會得到你想要的結果。

如果您使用StringBuilder構建一個完整的URL,爲什麼不創建StringBuilder每種方法?如果你不需要改變你的對象的任何狀態,你將是一個很長的線程安全的方式。

另外請注意,你的方法有一個params參數,但還可以訪問params實例變量(這將需要一個不同的名稱,如反正是params在C#中的關鍵字)。你真的需要重複嗎?爲什麼不直接使用方法中的實例變量?

感覺像這個類可以製作線程安全,但幾乎肯定不是而是。您需要將其設計爲線程安全 - 這意味着要麼避免任何狀態突變,要麼使用適當的鎖定。 (前面的方法通常是可能的更清潔。)