【问题标题】:StreamWriter and Samba2 (SMB2)StreamWriter 和 Samba2 (SMB2)
【发布时间】:2011-04-11 12:56:52
【问题描述】:

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

场景

  • 我在多台机器上运行多个服务
  • 每个服务都有多个线程,每个线程在 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”,因为它正被另一个进程使用。

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

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

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

因此,服务现在已停止,但机器保留了文件的句柄,并且您无法终止进程以保持句柄处于活动状态,除非重新启动机器。 . .

我现在不知道该怎么办,我想我什么都试过了。

注意事项

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

我最近更改了用于编写文件的代码,不顾一切地尝试将所有内容“委托”给 .net。现在是:

File.WriteAllText(pathToTheFile, stringToWriteInTheFile);

但我的直觉是,在秘密之下,.net 正在做同样的事情——虽然变化是最近才发生的,所以我仍然不能说“修复”是否有效。

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

【问题讨论】:

  • 文件,它总是同一个文件还是每个服务或线程都写入自己的文件?我担心从许多不同的来源访问同一个文件会导致死锁,解决方案是处理完全不同的写入请求。
  • @Vash:通常文件是不同的,但有时多个线程正在尝试写入同一个文件可能会发生(并且实际上会发生),但是:( - 执行 File.WriteAllText 应该'不处理并发问题?
  • File.WriteAllText 不一定会消除并发问题。这是打开文件、向其中写入内容然后关闭文件的便捷快捷方式。但是如果没有“锁定”文件,(1)其他一些进程/线程可能已经在您打开文件时打开了文件(2)其他一些进程/线程可能会在您写入文件时打开文件。使用 FileShare.None 打开 FileStream 对象应该(希望)消除这些问题。
  • answer 中找到的有关 File.WriteAllText 内部的信息。

标签: c# windows-services samba


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢大卫,我会努力的。正如我所怀疑的那样, File.WriteAllText 完全符合我之前所做的,所以我想它不会解决任何问题。我会告诉你的。
  • 更新:我只是确认 File.WriteAllText 不是正确的解决方案。我将实施您建议的解决方案并通知您。
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 2012-08-14
  • 1970-01-01
  • 2023-04-05
  • 2013-05-07
  • 2014-02-09
  • 2013-12-17
  • 2012-10-31
相关资源
最近更新 更多