我正在尝试使用1个锁定对象并尝试使用StreamWriter在锁定下的两个不同位置写入同一文件,但是我收到错误:
该进程无法访问文件'filename',因为它正由另一个进程使用。
定义了锁定对象,我使用了一个静态对象:
protected static Object Semaphore = new Object();
if(x != null)
{
lock (Semaphore)
{
using (StreamWriter sw = new StreamWriter(fileName))
{
sw.WriteLine(a + "," + b + "," + c);
sw.Close();
sw.Flush();
}
}
}
在此之后:
if(y != null)
{
lock (Semaphore)
{
using (StreamWriter sw1 = new StreamWriter(fileName))
{
sw1.WriteLine(a + "," + b + "," + c);
sw1.Close();
sw1.Flush();
}
}
}
我错过了什么?谢谢。
答案 0 :(得分:0)
该文件仍标记为"正在使用"通过您的操作系统 - 错误消息不是来自您的信号量机制。通常我认为信号量与使用相结合应该关闭文件。
两个代码部分中的哪一个会引发您的异常?你在其他地方打开它吗?
顺便说一下。请复制并粘贴/修复您的代码 - 您的粘贴演示代码将无法运行 - 关闭的Textwriters无法刷新!
MY testcase - 尚未线程化:
internal class Program
{
public static void DoStuff()
{
Directory.CreateDirectory(Path.GetDirectoryName(fileName));
if (x != null)
{
lock (lockObj)
{
WriteStuff();
}
}
if (y != null)
{
lock (lockObj)
{
WriteStuff();
}
}
}
private static string fileName = "C:\\temp\\tempfile.txt";
private static object lockObj = new object();
private static string x = "";
private static string y = "";
static void Main(string[] args)
{
DoStuff();
}
static void WriteStuff()
{
using (StreamWriter sw1 = new StreamWriter(fileName))
{
sw1.WriteLine("irrelevant");
}
}
}