无响应线程的问题

时间:2010-04-02 16:24:54

标签: c# multithreading thread-abort

我有一个Web应用程序,它在按钮上运行多个线程点击每个线程在不同的ipAddresses上进行IO调用,即(登录Windows帐户然后进行文件操作)。阈值为30秒。我假设在登录尝试时如果超过阈值,ipAddress上的设备与我的条件不匹配,因此我不关心它。 Thread.Abort()不适合我等待IO调用完成的情况,这可能需要很长时间。

我尝试在阈值超时后立即根据线程的状态执行db操作。它工作正常但是当我检查日志文件时,我注意到无响应线程的thread.IsAlive属性仍然是真的。在我的本地电脑上进行了几次调试之后,我遇到了一个可能的死锁情况(我怀疑)我的电脑严重崩溃了。

简而言之,你是否知道在执行button_click后立即杀死(强制)无响应的线程(等待IO操作)?

(PS:我没有使用线程池)

的Oguzhan

修改

进一步澄清,

我需要在每个ipAddress上验证给定的本地管理员凭据,并为后续的插入DB记录。其余的,我不在乎。

在我的验证方法中,我首先通过导入advapi32.dll来模拟管理员用户来调用win32的logonuser方法。之后我通过Directory.CreateDirectory方法在远程sys驱动器上创建一个临时目录,只是为了检查授权。如果抛出任何异常(UnauthorizedAccessException或IOException),那么远程机器就不感兴趣了,否则我们就把它插入到DB中。

我为给定的ip范围调用了验证方法同步方式,并且它适用于一堆连续的端点。但是,当我针对某些不相关的ipAddress范围测试该方法时,每次验证尝试都需要20秒到5分钟才能完成。

然后我将我的设计转换为多线程方式,我决定在单独的线程中运行每个验证,并在阈值数量的末尾中止无响应的线程。问题是thread.abort不适合这种情况,实际上等待IO指令的返回(我不想这样做)并在此之后引发一个ThreadAbortException。

为了完成连续线程的执行,我忽略了无响应的线程并继续执行数据库操作并从按钮单击方法返回(无响应的threds在那个时间点仍然存在)。在执行按钮单击(在调试模式下)几次后,系统崩溃之前,似乎还不错。问题可能是IIS服务下越来越多的生活线程。

线程未及时响应的原因是网络路径未找到情况。我的解决方案是在进行IO调用之前检查端口135上的TCP连接(端口135对于窗口上的RPC是必需的)。默认超时时间为20秒。如果需要设置timout,请使用BeginConenct。另一个选项是Ping(如果在网络中启用了ICMP)

1 个答案:

答案 0 :(得分:1)

为什么你真的需要中止线程呢?为什么不让它们正常完成而忽略结果呢? (保留一个令牌以指示它所在的“批量”请求,然后记住您当前对哪个批次感兴趣。)

另一个选择是保持你正在使用的任何内容进行IO调用(例如套接字)并关闭它;这会导致发出请求的线程出现异常。

另一个选择是避免将请求放在不同的线程上,而是使用异步IO - 你仍然会获得并行性,但不会占用线程(只是IO完成端口)。另外,你不能对IO操作本身设置超时吗?请求应该以这种方式自然超时。