StreamWriter和Samba2(SMB2)

时间:2011-04-11 12:56:53

标签: c# windows-services samba

好的,这个是一个很难的。

方案

  • 我在多台计算机上运行多项服务
  • 每个服务都有多个线程,每个线程在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);
}

[/ THE CODE]

问题

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

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

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

您可以删除该文件,但该文件已立即重新创建。就像一个永久的Stream存在并且一直无限地写入文件一样。

你可以停止服务:它被卡住,并且不会停止,所以我强迫一个Thread.Abort(是的,我知道但是练习,但还有什么?)2分钟后。

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

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

考虑

以前,FILER和机器都使用SMB1,这个问题从未出现过。所以我想在背景中发生了一些可疑的事情,但我无法理解......

我最近更改了用于编写文件的代码,并拼命试图将所有内容“委托”到.net。现在是:

File.WriteAllText(pathToTheFile, stringToWriteInTheFile);

但我的直觉是,在包装下,.net正在做同样的事情 - 虽然变化是相当新的,所以我仍然不能说“修复”是否起作用。

编辑(根据Vash评论):通常文件是不同的,但它可能发生(实际上发生)有时多个线程正在尝试写同一个文件,但是:(做File.WriteAllText应该'注意并发问题?

1 个答案:

答案 0 :(得分:2)

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

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

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

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