2014-01-30 36 views
0

所以這一點是我一直在掙扎了一會兒。我不是編碼員,所以我無法調試以找出問題所在。我正在使用允許變量的程序,並且可以將C#代碼片段輸入到程序中。有兩個問題,我正在使用文件test.txt。該程序運行25個線程。我想從test.txt中獲取98行,但我不希望任何兩個線程採用相同的行。我已經從朋友那裏得到了下面的代碼,它似乎工作。我只是想確認代碼是正確的。現在我需要做的是爲這段代碼添加一條新規則。 {-Project.Directory-} accounts.xls中有一個文件。每行有一個帳戶。問題是在多線程從accounts.xls採用相同的帳戶兩次,所以我得到一個錯誤,因爲從一個賬戶只有一個請求被允許在同一時間。我希望能夠只需要每個線程一個帳戶,這是不可能的兩個線程使用相同的帳號,也不可能兩個線程從的test.txt採取同樣的思路。我只是想盡可能提高效率。我被告知它需要被鎖定,但我不明白C#。誰能幫忙?C#鎖定問題以重複

IList<string> list = project.Lists["Domain Format List"]; 
lock (SyncObjects.InputSyncer) 
{ 
    string[] result = FileSystem.FileGetLines(@"{-Project.Directory-}test.txt","0-   97",true,false); 
    foreach (string results in result) 
    { 
     list.Add(results); 
    } 
} 

編輯:的test.txt不是100行,它包含90K行,我要帶它從98線這就是爲什麼它需要被鎖定。另外,accounts.xls包含50行

+0

@Alberto如果您編輯您還可以刪除*謝謝*。 [見這個元后(http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) – rene

+2

你的所有線程將在阻止'lock'行,這意味着不會有多線程。 – Groo

+0

好吧,我刪除了「謝謝」,我在這裏還是新手。在Groo。多線程仍然有效,似乎它不是重複行,但現在我需要鎖定「accounts.xls」,所以如果你理解我的意思,它只需要一行。 – user3194329

回答

1

從文件讀取行不應該進行多線程的,特別是如果你只需要在文件中〜100線。另一方面,如果單獨處理每條線需要花費很多時間,則可以考慮並行化操作。

的最簡單的方法是使用ParallelEnumerable擴展方法來處理線:

var processedResults = File.ReadLines(@"path-to-file.txt") 
    .AsParallel() 
    .Select(line => Process(line)) 
    .ToList(); 

Process是取單個string線並執行「長時間運行操作」來處理它的方法:

private static ProcessedData Process(string input) 
{ 
    // get ProcessedData from input 
} 

注意AsParallelIEnumerable<string>轉換爲ParallelQuery<string>,這意味着SelectToList允許日讀安全並行處理(只要您的Process方法對於多線程安全,或者更好而無狀態)。

如果Process方法是無狀態的,則不需要任何其他同步構造(即lock s)。