C#移动操作挂起而不是立即抛出异常

时间:2016-05-13 12:19:44

标签: c# .net windows winforms visual-studio

有谁知道为什么有时C#中的Directory.Move()操作挂起/等待而不是立即抛出异常?

例如:
如果我在Directory.Move()块中使用try方法,然后在文件资源管理器中导航到该文件夹​​,Windows会创建一些锁定它的句柄。

然后,我希望catch块立即执行,但是它就像应用程序在它抛出异常之前挂起10-15秒。

有趣的是,如果我在这10-15秒内走到文件资源管理器中的文件夹之外,那么应用程序实际上完成了Move()操作。

就像:不是立即抛出异常,Windows挂起10-15秒,看看负责句柄(锁)的人是否自己关闭这些句柄。

有没有办法让应用程序立即抛出异常?

1 个答案:

答案 0 :(得分:0)

你问题的答案"有谁知道为什么有时C#中的移动操作挂起/等待而不是立即抛出异常?"可能是.net框架从其NTFS锁定请求发出Pending状态,并最终放弃。

System.IO.Directory.Move直接映射到Kernel32函数;我猜最终这会发现自己调用LockFileEx(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx),它允许调用者指定在无法获得锁定时是否立即失败,或者等待指定的时间。我想Kernel32使用了这个允许设置超时的变体。看起来.net框架对它使用的超时没有任何影响。