作为大型自动化流程的一部分,我们正在调用第三方API,它可以在另一台机器上调用服务.我们最近发现,当其他计算机不可用时,API调用有时会在尝试连接到远程服务器时旋转40分钟.
我们正在使用的API没有提供指定超时的方法,我们不希望我们的程序等待那么久,所以我认为线程将是一种强制执行超时的好方法.生成的代码如下所示:
Thread _thread = new Thread(_caller.CallServices()); _thread.Start(); _thread.Join(timeout); if (_thread.IsAlive) { _thread.Abort(); throw new Exception("Timed-out attempting to connect."); }
基本上,我想让APICall()运行,但是如果它在超时过后仍然存在,则假设它将失败,将其终止并继续前进.
由于我刚接触C#和.net运行时的线程,我想我会问两个相关的问题:
.net库中是否有更好/更合适的机制用于我正在尝试做的事情,并且我在那段代码中提交了任何线程陷阱吗?
Thread.Abort()是一个请求线程中止,并不保证它会及时这样做.它也被认为是不好的做法(它会在中止的线程中抛出一个线程中止异常,但看起来第三方API没有其他选择.
如果您(以编程方式)知道远程服务主机的地址,则应在将控制权转移到第三方API之前对其进行ping操作.
如果不使用backgroundworker,可以将线程的IsBackgroundThread设置为true,这样就不会使程序终止.