使用C#是否可以测试文件上是否持有锁

使用C#是否可以测试文件上是否持有锁,c#,locking,filestream,C#,Locking,Filestream,背景: 我使用文件的偏移量和Filestream lock/unlock方法来控制读/写访问。我使用以下代码来测试文件当前是否持有锁 try { fs.Lock( RESERVED_BYTE, 1 ); fs.Unlock( RESERVED_BYTE, 1 ); rc = 1; } catch { rc = 0; } 问题: 我的目标是消除try/catch块。是否有更好的方法查看锁是否存在 编辑: 注意:此问题与文件是否存在无关。我已经知道了。这是关于同步写入访问的。就

背景: 我使用文件的偏移量和Filestream lock/unlock方法来控制读/写访问。我使用以下代码来测试文件当前是否持有锁

try
{
  fs.Lock( RESERVED_BYTE, 1 );
  fs.Unlock( RESERVED_BYTE, 1 );
  rc = 1;
}
catch
{ 
  rc = 0; 
}
问题:
我的目标是消除try/catch块。是否有更好的方法查看锁是否存在

编辑:

注意:此问题与文件是否存在无关。我已经知道了。这是关于同步写入访问的。

就我个人而言,在尝试打开文件时,我只会捕获一个锁定的文件。如果它现在被解锁,当你试图打开它时,它可能会被锁定(即使只是几毫秒后)。

我认为如果没有try,catch就不可能了。

你可以通过p/Invoke层直接调用。您将使用FileStream上的SafeFileHandle属性返回的句柄

直接调用API将允许您检查返回值是否存在错误条件,而不是诉诸于捕获异常


询问对p/Invoke层的调用与try/catch的调用之间是否存在开销

锁文件通过p/Invoke层进行相同的调用,如果对锁文件的调用返回0,则抛出异常。在您的情况下,您没有抛出异常。如果文件被锁定,您将花费更少的时间,因为您没有处理堆栈展开

我认为,实际的p/Invoke设置大约有七条指令(比较而言,COM interop大约有40条),但这一点没有意义,因为对LockFile的调用与托管方法所做的事情相同(使用p/Invoke层)

我的目标是消除try/catch块


请记住,文件系统是不稳定的:仅仅因为您的文件在一个操作中处于一种状态,并不意味着在下一个操作中它将处于相同的状态。您必须能够处理文件系统中的异常。

在某些情况下,您也可以使用它,它通常由调试器或探查器实现,但是它可以从任何代码中使用,因为调试器通常要求打开调试端口的线程不是先决条件。因此,WCT是关于锁争用的非常全面和精确的信息


一个(尽管有些复杂),show的实用程序用于CLR上本机调试API的这个特定子集。

try/catch块是正确的解决方案(尽管您希望捕获IOException,而不是所有异常)。您无法正确同步,因为测试锁+获取锁不是一个原子操作。感谢您的更正。实际上,在这个例行程序中,我只想测试锁,“获取/释放”是我唯一能想到的方法;我总是以读/写模式打开,但希望将写入同步到一些关键数据结构。我曾考虑过使用P/Invoke层,但担心与使用try/catch相比的开销。对此有何评论?我刚刚看到一个非常好的MSDN杂志,专门针对.net,我想它对一些人来说会很方便。这篇文章是Joe Duffy写的,我相信他是lib-dev的主要并行任务之一。我发现它与一篇关于锁定问题的更一般性的论文相关联,但在接近尾端的地方有一个侧栏,其中有几处提到了更为利基的内容,涉及到关于锁定/核心开发的主题。