如何从C#中的多个进程附加到共享文件?
请仔细阅读问题,然后再将其标记为副本如何从C#中的多个进程附加到共享文件?,c#,.net,windows,C#,.net,Windows,请仔细阅读问题,然后再将其标记为副本 我们有一个Windows文件服务器 我们还有多个.NET进程在不同的机器上运行,所有进程都定期附加到共享文件(在文件服务器上)(我们称之为foo.txt) 如何确保从所有进程对文件进行序列化写入,而不必在文件服务器上创建.lock文件 注意:使用锁/互斥锁/信号量/等待句柄不是一个选项,因为进程在不同的机器上运行 我能想到的最好的办法(我没有理由相信这是行不通的)是: private void TryWrite(字符串文件路径、字符串负载) { 对于(变
- 我们有一个Windows文件服务器
- 我们还有多个.NET进程在不同的机器上运行,所有进程都定期附加到共享文件(在文件服务器上)(我们称之为
)foo.txt
锁
/互斥锁
/信号量
/等待句柄
不是一个选项,因为进程在不同的机器上运行
我能想到的最好的办法(我没有理由相信这是行不通的)是:
private void TryWrite(字符串文件路径、字符串负载)
{
对于(变量i=0;i<10;++i)
{
尝试
{
使用(var fs=File.Open(filePath、FileMode.Append、FileAccess.Write、FileShare.Read))
使用(var编写器=新的StreamWriter(fs))
{
writer.WriteLine(有效载荷);
}
返回;
}
抓住
{
系统线程线程睡眠(1000*(i+1));
}
}
//日志无法写入
}
但我仍然偶尔会收到来自不同进程的交叉写入
>非常感谢。而不是共享多个进程中可以由多个进程写入的单个文件,我会考虑集中文件的编写,或者可能实现每个进程调用的API来实现这一点。通过这种方式,您可以保证写操作按照接收到它们的准确顺序进行,并且没有这些可以减轻责任的问题。我知道这不是一个直接的答案,但它会解决你的问题。是的,那将是正确的做法。但是我们在这里处理的是一个遗留的企业架构。你能定义一些不同的机器写入文件的时刻吗。。。一些避免重叠的规则为什么不使用客户机-服务器模型,并且每次您要写入文件时,您都会将消息发送给服务器并由服务器处理队列,这将避免在两个进程之间出现任何问题,因为服务器将负责同步process@Johnny这就是我在做的!
private void TryWrite(string filePath, string payload)
{
for (var i = 0; i < 10; ++i)
{
try
{
using (var fs = File.Open(filePath, FileMode.Append, FileAccess.Write, FileShare.Read))
using(var writer = new StreamWriter(fs))
{
writer.WriteLine(payload);
}
return;
}
catch
{
System.Threading.Thread.Sleep(1000 * (i + 1));
}
}
// log unable to write
}