好吧,伙计们,这是一个艰难的。

场景 :

  • 我有多个服务在多台机器上运行
  • 每个服务都有多个线程,每个线程在FILER上写一个文件——我的机器使用的共享存储(使用\\filername\foo\bar等共享)
  • FILER 机器是 NetApp 机器
  • FILER 和运行服务的机器都使用 SMB2 (http://en.wikipedia.org/wiki/Server_Message_Block)
  • 用于写文件的指令和下面[THE CODE]
  • 中列出的一样简单

    [编码]
    using (StreamWriter outfile = new StreamWriter(pathToTheFile, false))
    {
      outfile.Write(stringToWriteInTheFile);
    }
    

    [/编码]

    问题 :

    有时该服务仍然“卡在”这条指令上。给出的错误是:

    该进程无法访问文件“\\filername\foo\bar\myfile.txt”,因为它正被另一个进程使用。

    在其中一些错误之后,服务拒绝释放对文件的锁定。那会发生什么?

    您可以删除该文件,但会立即重新创建该文件。就像某种永久 Stream 还活着并无限期地写入文件一样。

    您可以停止该服务:它被卡住了,并且不会被停止,所以我在 2 分钟后强制执行了 Thread.Abort(是的,我知道但要练习,但还有什么?)。

    因此,服务现在停止了,但机器保留了文件的句柄,除非重新启动机器,否则您无法终止保持句柄事件的进程。 . .

    我现在不知道该怎么办,我想我已经尝试了一切。

    注意事项 :

    以前,FILER 和机器都使用 SMB1,从来没有出现过这个问题。所以我猜在后台发生了一些可疑的事情,但我不明白是什么......

    我最近更改了用于编写文件的代码,绝望地尝试将所有内容“委托(delegate)”给 .net。现在是:
    File.WriteAllText(pathToTheFile, stringToWriteInTheFile);
    

    但我的直觉是,在幕后,.net 正在做完全相同的事情 - 虽然这个变化是最近发生的,所以我仍然不能说“修复”是否有效。

    编辑(根据 Vash 评论):通常文件是不同的,但有时可能会发生(并且实际上会发生)多个线程试图写入同一个文件,但是 :( - 执行 File.WriteAllText 不应该注意并发问题?

    最佳答案

    尝试以“独占”模式显式打开 FileStream,即

    using (var fs = new FileStream("path",
                                  FileMode.Open, FileAccess.ReadWrite,
                                  FileShare.None))
    {
        using (var sw = new StreamWriter(fs))
        {
            ...
    

    当然,您的代码必须预料到该文件在写入时可能会被锁定并做出适当的 react 。这部分留给读者作为练习:-)

    免责声明:我已经在多线程环境中使用过它,但我不能保证它可以在 Samba 上工作。

    关于c# - StreamWriter 和 Samba2 (SMB2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5621639/

    10-10 18:13