首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在asp.net中限制try{} catch{}的加载时间的计时器

在asp.net中限制try{} catch{}的加载时间的计时器
EN

Stack Overflow用户
提问于 2016-04-04 06:44:44
回答 2查看 399关注 0票数 0
代码语言:javascript
复制
<%@ 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块。如何在此代码中插入计时器?

EN

回答 2

Stack Overflow用户

发布于 2016-04-04 09:01:04

为此,我会使用微软的反应式扩展。只需NuGet "Rx-Main“。然后你可以这样做:

代码语言:javascript
复制
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,因为可观察对象只生成一个值,这就是您得到的全部内容。

票数 1
EN

Stack Overflow用户

发布于 2016-04-04 07:53:16

您可以使用WaitForExit扩展方法shown in this answer来完成此操作。

只需将您的Dns.GetHostByName调用包装到一个Action中,它会将结果赋值给GetIPHost变量,并调用扩展方法。

代码语言:javascript
复制
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扩展方法:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36392160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档