Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中的多个进程附加到共享文件?_C#_.net_Windows - Fatal编程技术网

如何从C#中的多个进程附加到共享文件?

如何从C#中的多个进程附加到共享文件?,c#,.net,windows,C#,.net,Windows,请仔细阅读问题,然后再将其标记为副本 我们有一个Windows文件服务器 我们还有多个.NET进程在不同的机器上运行,所有进程都定期附加到共享文件(在文件服务器上)(我们称之为foo.txt) 如何确保从所有进程对文件进行序列化写入,而不必在文件服务器上创建.lock文件 注意:使用锁/互斥锁/信号量/等待句柄不是一个选项,因为进程在不同的机器上运行 我能想到的最好的办法(我没有理由相信这是行不通的)是: private void TryWrite(字符串文件路径、字符串负载) { 对于(变

请仔细阅读问题,然后再将其标记为副本

  • 我们有一个Windows文件服务器
  • 我们还有多个.NET进程在不同的机器上运行,所有进程都定期附加到共享文件(在文件服务器上)(我们称之为
    foo.txt
如何确保从所有进程对文件进行序列化写入,而不必在文件服务器上创建.lock文件

注意:使用
/
互斥锁
/
信号量
/
等待句柄
不是一个选项,因为进程在不同的机器上运行

我能想到的最好的办法(我没有理由相信这是行不通的)是:

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
}