<%@ Page Language="c#" Debug="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<script language="c#" runat="server">
void BtnCheck_Click(Object sender,EventArgs e) {
try
{
IPHostEntry GetIPHost = Dns.GetHostByName(Request.QueryString["domain"] + ".org");
LblValue.Text += "<br>" + Request.QueryString["domain"] + ".org#";
foreach(IPAddress ip in GetIPHost.AddressList)
{
long HostIpaddress = ip.Address;
LblValue.Text += ip.ToString() + "#";
}
}
catch(Exception ex){
LblValue.Text += "<br>" + Request.QueryString["domain"] + ".org#";
LblValue.Text += "" + ex.Message + "#";
}
}
</script>
<html>
<title>DNS LOOKUP</title>
<head>
</head>
<body OnLoad="BtnCheck_Click" value="Send" runat="server">
<asp:Label id="LblValue" runat="server" />
</body>
</html>当我尝试进行dns查找时,可能需要3-4秒以上的时间才能获取信息。我想把它的加载时间限制在1000毫秒。如果超过1001毫秒,我想退出try块。如何在此代码中插入计时器?
发布于 2016-04-04 09:01:04
为此,我会使用微软的反应式扩展。只需NuGet "Rx-Main“。然后你可以这样做:
string hostName = Request.QueryString["domain"] + ".org";
IObservable<string> getIPAddresses =
from host in Observable.Start(() => Dns.GetHostByName(hostName))
select String.Join("#", host.AddressList.Select(ip => ip.Address.ToString()));
IObservable<string> getTimeout =
from x in Observable.Timer(TimeSpan.FromMilliseconds(1001))
select ""; // Or Timeout message here
string text = Observable.Amb(getIPAddresses, getTimeout).Wait();
LblValue.Text += "<br>" + hostName + "#";
LblValue.Text += text;实现这一点的关键是Observable.Amb运算符,它基本上试图同时运行两个可观察值,并且第一个产生值的运算符获胜。然后,Wait()根据可观察对象生成的最后一个值将IObservable<string>转换为string,因为可观察对象只生成一个值,这就是您得到的全部内容。
发布于 2016-04-04 07:53:16
您可以使用WaitForExit扩展方法shown in this answer来完成此操作。
只需将您的Dns.GetHostByName调用包装到一个Action中,它会将结果赋值给GetIPHost变量,并调用扩展方法。
try
{
IPHostEntry GetIPHost = null;
var action = new Action(() => GetIPHost = Dns.GetHostByName(Request.QueryString["domain"] + ".org"));
action.WaitForExit(1000); // this will cancel the method after 1000 milliseconds
if (GetIPHost != null)
{
LblValue.Text += "<br>" + Request.QueryString["domain"] + ".org#";
foreach (IPAddress ip in GetIPHost.AddressList)
{
long HostIpaddress = ip.Address;
LblValue.Text += ip.ToString() + "#";
}
}
}
catch (Exception ex)
{
LblValue.Text += "<br>" + Request.QueryString["domain"] + ".org#";
LblValue.Text += "" + ex.Message + "#";
}WaitForExit扩展方法:
public static class ActionExtentions
{
public static bool WaitForExit(this Action action, int timeout)
{
var cts = new CancellationTokenSource();
var task = Task.Factory.StartNew(action, cts.Token);
if (Task.WaitAny(new[] { task }, TimeSpan.FromMilliseconds(timeout)) < 0)
{
cts.Cancel();
return false;
}
else if (task.Exception != null)
{
cts.Cancel();
throw task.Exception;
}
return true;
}
}https://stackoverflow.com/questions/36392160
复制相似问题