这是一个很有意思的话题:
很多时候,一个操作如果成功的话,很快就会得到响应,反正,只有当长时间没有响应,我们才能确定该操作失败。
例如Ping一个主机,如果主机可以连接的话,马上就有反应;反之,如果对于Ping命令,主机长时间不响应,我们才能认定主机无法连通。所以这里有个TimeOut的问题。
问题是,很多操作并不提供一个设置超时的方法,例如通过Dns.GetHostByAddress解析主机,或者用WMI连接远程主机时,虽然我们明明知道如果过了1秒钟还没反应的话,基本上就失败了,但是我们还得无奈地等待漫长的超时。
这里有个办法能够解决这个困扰——使用多线程自定义超时,举例如下:
string GetHostName(string ip, int time)
{
string hostName = null;
Thread th = new Thread(() =>
{
try
{
hostName = Dns.GetHostByAddress(ip).HostName;
}
catch { }
});
th.Start();
if (!th.Join(time))
th.Abort();
return hostName;
}