я следующие фрагменты кода:C# консольное приложение многопоточности вопрос с задачами
lock (lockObject)
{
foreach (KeyValuePair<string, List<string>> entry in productDictionary)
{
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour,entry.Key);
Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, entry.Value));
}
}
productDictionary является ConcurrentDictionary
из <string, List<string>>
, который я пытаюсь перебирать. Для каждой пары значений ключа я пытаюсь построить путь к файлу на основе Key
, а затем выписать список строк, хранящихся в Value
. Для этого я начинаю новую задачу, которая вызывает следующий метод:
public static void WriteProductFile(string filePath, List<string> productQuotes)
{
using(StreamWriter streamWriter = new StreamWriter(filePath))
{
productQuotes.ForEach(x => streamWriter.WriteLine(x));
}
}
Stepping через код все выглядит нормально на первый. Помещение точки останова при вызове метода для WriteProductFile
показывает, что правильные параметры передаются в метод через Задачу. Однако, когда моя программа фактически сводит ее к методу WriteProductFile, параметры становятся несогласованными. То есть, список строк, которые не соответствуют пути к файлу, был передан, и поэтому мои данные не подходят после завершения программы. Ошибок не возникает, и программа выполняется нормально, но неправильная информация записывается в неправильные файлы.
Я думал, что ConcurrentDictionary и Lock позаботятся о любых проблемах с нитями, которые возникнут, но, видимо, я что-то пропустил. Есть идеи?
Это немного запутанно ... «WriteProductFile» - это статический метод, что означает, что он совместно используется для одновременного выполнения задач ... – McGarnagle
@dbaseman Я новичок в C# threading - это способ обойти это в статическом консольном приложении? –