【发布时间】:2012-04-05 16:52:48
【问题描述】:
在我的 Windows 窗体应用程序中,我正在尝试测试用户访问远程计算机共享文件夹的能力。我这样做的方式(我确信有更好的方法......但我不知道它们)是检查远程机器上是否存在特定目录(我正在这样做由于我在组织中遇到的防火墙/其他安全限制)。如果用户有权访问共享文件夹,那么它会立即返回,但如果他们没有,它就会永远挂起。为了解决这个问题,我将检查放入另一个线程并仅等待 1000 毫秒,然后确定用户无法点击该共享。但是,当我这样做时,它仍然挂起,就好像它从未在同一个线程中运行过一样。
是什么导致它挂起,我该如何解决?我认为它在一个单独的线程中的事实将允许我让线程在后台自行完成.
这是我的代码:
bool canHitPath = false;
Thread thread = new Thread(new ThreadStart(() =>
{
canHitPath = Directory.Exists(compInfo.Path);
}));
thread.Start();
thread.Join(1000);
if (canHitPath == false)
{
throw new Exception("Cannot hit folder: " + compInfo.Path);
}
编辑:我觉得应该补充一下抛出异常的那一行IS HIT。我已经对此进行了调试并对其进行了验证……但是,当引发异常时,就是我的程序挂起的时候。 (我还可以补充一点,异常是在调用方法中捕获的,而我从来没有到达调试器中的 catch 语句。)
【问题讨论】:
-
这是一个有趣的问题。直观地说,如果实际连接不能在 1 秒内执行,
Join(1000)应该中止。我想知道:如果您尝试加入的线程实际上处于不间断的 IO 等待中,那么它会导致两个线程都卡在 IO 等待中吗? -
可能相关的问题(虽然不完全相同):How To: Prevent Timeout When Inspecting Unavailable Network Share - C#.
-
@DanielPryden 是的,就是这样。我以前见过这种情况。
-
另一个可能相关的问题:How to join a thread that is hanging on blocking IO? 但是,该问题专门针对 Linux 上的 libpthread 问题。
-
@DanielPryden 看看这个:drdobbs.com/parallel/212001285
标签: c# multithreading winforms