Процесс не может получить доступ к файлу 'abc.log', потому что он используется другой процесс.
Привет, я видел это исключение из моего приложения occationaly, но я все еще пытаюсь это исправить, надеюсь, что я получу некоторое представление из stackoverflow.
В моем приложении я определил функцию WriteToLog, которая будет записывать в файл журнала. Также mainForm моего приложения запустит backgroundWorker выполнить некоторую работу, которая также вызывает WriteToLog. Может быть, два потока доступа к файлу вызовут проблему? Но в моем коде Я уже сделал все возможное, чтобы написать флеш и закрыть текстовый файл (я думаю), и вот мой код из WriteToLog:
StreamWriter sw = null;
string newText = "";
try
{
//populate the content for newText
sw = File.AppendText(LOG_FILE);
sw.Write(newText);
sw.Flush();
sw.Close();
}
catch (IOException ex)
{
MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (sw != null)
{
sw.Close();
}
}
Я думаю, что до тех пор, пока я скрываю и закрываю streamWriter, я должен буду многократно писать WriteToLog и в многопотоках, не так ли? Или если я ошибаюсь, могу ли я сделать простой файл открытым, или есть другие причины/решения?
Это, вероятно, не связано с вашей проблемой, но вы можете немного упростить этот код, используя оператор using
с вашим StreamWriter
вместо finally
. Это также имеет дополнительное преимущество: не нужно явно вызывать Close
или Flush
(закрытие потока также сбрасывает его).
Я не пробовал компилировать это, но это должно быть что-то вроде:
string newText = "";
try
{
//populate the content for newText
using (StreamWriter sw = File.AppendText(LOG_FILE))
{
sw.Write(newText);
}
}
catch (IOException ex)
{
MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Нет; разные потоки, пытающиеся открыть файл в одно и то же время, будут мешать друг другу. Вы могли бы lock
использовать общий object
, чтобы заставить потоки запускать один за раз.
Или просто используйте встроенную функцию .NET tracing; вы можете настроить app.config
для записи в файл.
Если вы вызываете это из нескольких потоков, вы должны убедиться, что операции с файлом являются атомарными. Очень вероятно, что Thread A пройдет через AppendText и остановится, например. on Write, в этот момент Thread B получает запланированное задание и начинает писать тот же (теперь заблокированный) файл.
Один из способов справиться с этим - разместить область lock вокруг инструкций, представленных в вашем примере кода.