c# - 另一个进程使用的文件 - StreamWriter
问题描述
我检查了所有其他解决方案,没有任何工作。我正在从不同的按钮事件调用异步日志记录方法。
private async void button1_Click(object sender, EventArgs e)
{
await Task.Run(() => LoggerTest());
}
private async void button2_Click(object sender, EventArgs e)
{
await Task.Run(() => LoggerTest());
}
private async void LoggerTest()
{
for (int i = 0; i < 10000; i++)
{
Logger.Log(string.Format("Counter: {0}", i));
Thread.Sleep(10);
}
}
日志方法使用StreamWriter
private void Log(string log)
{
if (!IsFileLocked(fullPath))
{
using (StreamWriter file = new StreamWriter(fullPath, append: true))
{
file.WriteLine(log);
file.Close(); // I know this is unnecessary in the using block
}
}
}
private bool IsFileLocked(string file)
{
try
{
using (var stream = File.OpenRead(file))
return false;
}
catch (IOException)
{
return true;
}
}
当我单击 button1 和 button2 时,捕获到以下异常:
System.IO.IOException:'进程无法访问文件'C:..\x.txt',因为它正被另一个进程使用。'
解决方案
尝试这样的事情
private static readonly object locker = new object();
lock (locker)
{
using (FileStream fileStream = new FileStream("FilePath"), FileMode.Append))
{
using (StreamWriter writer = new StreamWriter(fileStream))
{
writer.WriteLine(log);
}
}
}
lock 关键字将锁定流写入器,直到当前写入器进程完成
推荐阅读
- ios - 将无法访问的 ViewControllers 留在应用程序中是否安全?
- iphone - iPhone XR 上的 React Native 矢量图标中的别名
- flutter - 颤振链接错误与shared_preferences(ios)
- unit-testing - 如何从kotlin中的对象获取java类?
- c# - 如何在 C# 中使用 Microsoft.Office.Interop.Excel 添加数据透视表过滤器
- c# - Microsoft Azure > Web App -- SQL 连接被远程主机强行关闭 -- 仅在空闲时间后的第一次调用时发生
- android - 输入类型=范围滑动行为在 Android 上的 Chrome 中被破坏
- macos - 如何知道某个系统包头属于哪个 MacOS 版本?
- sql - Oracle 存在节点有效载荷搜索
- c - 从 C 回调创建一维数字 lua 表