Я беру проект C # и при тестировании получаю ошибки. Ошибка в том, что файл журнала не может быть записан, потому что он используется другим процессом. Вот код:
public void WriteToLog(string msg)
{
if (!_LogExists)
{
this.VerifyOrCreateLogFile(); // Creates log file if it does not already exist.
}
// do the actual writing on its own thread so execution control can immediately return to the calling routine.
Thread t = new Thread(new ParameterizedThreadStart(WriteToLog));
t.Start((object)msg);
}
private void WriteToLog(object msg)
{
lock (_LogLock)
{
string message = msg as string;
using (StreamWriter sw = File.AppendText(LogFile))
{
sw.Write(message);
sw.Close();
}
}
}
_LogLock определяется как переменная класса:
private object _LogLock = 0;
Основываясь на моих исследованиях и том факте, что это работает нормально в производственной системе в течение нескольких лет, я не знаю, в чем может быть проблема. Блокировка должна препятствовать тому, чтобы другой поток попытался записать в файл журнала.
Внесенные мною изменения, которые необходимо протестировать, намного чаще используют логи. По сути, мы добавляем режим отладки, чтобы сохранить в журнале гораздо больше информации, чем раньше.
Спасибо за любую помощь!
EDIT
Спасибо за быстрые ответы! Код для VerifyOrCreateLogFile () действительно использует _LogLock, так что это не должно быть проблемой. Он делает некоторую запись в журнал до того, как произойдет ошибка, поэтому он прекрасно справляется с созданием файла.
Проблема, по-видимому, в том, что раньше только один класс создавал экземпляр класса журнала, а теперь я добавил экземпляры в другие классы. Имеет смысл, что это создаст проблемы. Изменение поля _LogLock на статическое устраняет проблему.
Еще раз спасибо!