有一個應用程序可以根據某些條件對大的txt文件進行排序。 我需要開始例如5個線程,但我從文件與foreach循環逐行閱讀。 如果我用我的代碼啓動5個線程,所有線程將採用相同的行。如何使用foreach循環制作多線程應用程序
這裏是我的代碼,我開始1線:
Thread[] thr;
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
button4.Enabled = true;
decimal value = 1;
int i = 0;
int j = (int)(value);
thr = new Thread[j];
for (; i < j; i++)
{
thr[i] = new Thread(new ThreadStart(go));
thr[i].IsBackground = true;
thr[i].Start();
}
}
private static IEnumerable<string> ReadLineFromFile(TextReader fileReader)
{
using (fileReader)
{
string currentLine;
while ((currentLine = fileReader.ReadLine()) != null)
{
yield return currentLine;
}
}
}
public void go()
{
while (true)
{
TextReader readFile = new StreamReader(file_path, System.Text.Encoding.UTF8, true);
foreach (string line in ReadLineFromFile(readFile))
{
if (line.Split(':')[0].Contains("@"))
{
string out_line = line.Split(':')[0].Replace("+", "") + ":" + line.Split(':')[1];
lock (locker)
{
mail_count++;
log_mail(mail_count);
mail.Add(out_line.Trim().Replace(";", ":"));
}
}
else
{
string out_line = line.Split(':')[0].Replace("+", "") + ":" + line.Split(':')[1];
lock (locker)
{
rubbish_count++;
log_rubbish(rubbish_count);
rubbish.Add(out_line.Trim());
}
}
}
MessageBox.Show("Ready");
BeginInvoke(
new MethodInvoker(() =>
{
button1.Enabled = true;
button4.Enabled = false;
}));
break;
}
}
老實說,不管你做什麼,你的硬盤只能是在給定時間一個位置,所以沒有真正的點「並行「一個文件讀取。 然而,你可以給每個線程提供一個偏移量,以便從文件中開始讀取,但這不會加速任何事情^^ – C4stor
如果你真的想加速你的函數,你必須使用磁盤緩存來獲得你的優勢:在實際需要之前開始閱讀文件。這會自動將文件加載到內存中(http://en.wikipedia.org/wiki/Page_cache),然後在實際需要時可以從RAM中讀取它。然後,您可以充分利用Pako生產者 - 消費者模式。 – C4stor