Вы не должны использовать файл в многопоточных приложениях, потому что проблемы с параллелизмом .
Примером может быть это содержимое файла:
Реферер: http://google.com
RefReferrer: http://stackoverflow.com
ошибка: http://meta.com
Реферер: http://yahoo.com
И это довольно простой вопрос.
Вместо этого вы можете использовать основанную на файле базу данных (например, SQLite ) или, конечно, подходящую базу данных (не обязательно RDBMS).
Или в худшем случае вам нужно синхронизировать записи вручную :
static class Stats {
static object locker = new object();
public static Write(string someData) {
lock(locker) {
using (var stream = File.Open("pathtofile", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
using (var writer = new StreamWriter(stream)) {
writer.WriteLine(someData);
}
}
}
}
ПРИМЕЧАНИЕ здесь:
- синхронизация обрабатывается в одном и только одном приложении (так что обычно вы не можете иметь несколько процессов, работающих с файлом;
- вам не нужно проверять, существует файл или нет.
FileMode.Append
позаботится об этом.
Другой вариант - использовать Log4net , который намного лучше справляется с параллелизмом.
Так что вы можете написать свою статистику в виде файлов журнала:
static class Stats {
private static readonly ILog log = LogManager.GetLogger(typeof (Stats));
public static Write(string someData) {
log.Info(someData)
}
}