作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用下一个代码来记录 Web 应用程序的错误。
using (StreamWriter myStream = new StreamWriter(sLogFilePath, true))
{
myStream.WriteLine(string.Format("{0, -45}{1, -25}{2, -10 {3}", guid, DateTime.Now, StringEnum.GetStringValue(enumMsg), sText));
}
有时,会出现以下异常“System.IO.IOException:进程无法访问文件‘.txt’,因为它正被另一个进程使用。”被抛出。
我认为这是由网络应用程序的多个实例同时引起的。你能帮我解决这个问题吗?
编辑:我必须为我这样记录的每个方法添加它:
日期 - 方法 X 开始。
日期 - Exception.Message(未找到表或其他错误)
日期 - 方法 X 停止。
当出现这个错误时,它只记录这个:
日期 - System.IO.IOException:进程无法访问文件“.txt”,因为它正被另一个进程使用。
最佳答案
遗憾的是 Windows 不允许等待文件锁定。为了解决这个问题,您的所有应用程序都必须创建一个所有相关进程都可以检查的锁。
使用此代码只会阻止单个进程中的线程访问文件:
/* Suitable for a single process but fails with multiple processes */
private static object lockObj = new Object();
lock (lockObj)
{
using (StreamWriter myStream = new StreamWriter(sLogFilePath, true))
{
myStream.WriteLine(string.Format("{0, -45}{1, -25}{2, -10 {3}", guid, DateTime.Now, StringEnum.GetStringValue(enumMsg), sText));
}
}
为了跨多个进程锁定,需要互斥锁。这为其他进程可以检查的锁提供了一个名称。它是这样工作的:
/* Suitable for multiple processes on the same machine but fails for
multiple processes on multiple machines */
using (Mutex myMutex = new Mutex(true, "Some name that is unlikly to clash with other mutextes", bool))
{
myMutex.WaitOne();
try
{
using (StreamWriter myStream = new StreamWriter(sLogFilePath, true))
{
myStream.WriteLine(string.Format("{0, -45}{1, -25}{2, -10 {3}", guid, DateTime.Now, StringEnum.GetStringValue(enumMsg), sText));
}
}
finally
{
myMutex.ReleaseMutex();
}
我不认为 Mutexes 可以从远程机器访问,所以如果你在文件共享上有一个文件并且你试图从多台机器上的进程写入它那么你可能最好在托管文件以在进程之间进行调解的机器。
关于c# - 系统.IO.IOException : The process cannot access the file '.txt' because it is being used by another process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940878/
我是一名优秀的程序员,十分优秀!