У вас есть приложение, которое сортирует большой файл 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;
}
}
Честно говоря, все, что вы делаете, вы жесткий диск может быть только в одном положении в данный момент времени, так что нет никакого реального смысла «распараллеливание msgstr "прочитанный файл. Вы могли бы, однако, дать смещение каждому потоку, из которого можно начать чтение в файле, но это не ускорит что-либо. ^^ – C4stor
Если вы действительно хотите ускорить свою функцию, вам нужно использовать кэширование дисков в ваших интересах : начните чтение файла, прежде чем он действительно понадобится. Это автоматически загрузит файл в память (http://en.wikipedia.org/wiki/Page_cache), а затем вы сможете прочитать его из ОЗУ, когда это действительно необходимо. Тогда вы сможете полностью использовать шаблон производителя-потребителя Pako , – C4stor