2016-04-03 8 views
0
<%@ 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ブロックを終了します。このコードにタイマーを挿入するにはどうすればよいですか?asp.netのtry {} catch {}の読み込み時間を制限するタイマー

+0

タイムアウトで 'try'ブロックを終了すると、' catch'ブロックを実行しますか? – Enigmativity

+0

catchブロックの応答は必要ありません。 ** GetHostByName()**の情報を1000ミリ秒で取得したいだけです。何らかの情報を返すことができない場合、NULLの結果は大丈夫です –

答えて

0

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; 
    } 
} 
+0

私の質問を編集し、私の.aspxページにすべてのコードを書きました。 asp.netで試してみて、コードをコピーしてスクリプトタグの中に貼り付けて、行にエラーを表示させてください* public static bool WaitForExit(このアクションアクション、intタイムアウト)* –

+0

エラーは何ですか?拡張メソッドはpublic静的クラスの中に宣言する必要があります。したがって、 'public static class ActionExtentions'も含めてください。 –

1

私はこのために、Microsoftの反応性の拡張機能を使用します。ちょうど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; 

を、この作品を作るための鍵は、基本的に観測し、値の勝利を生成するために、最初の1の両方を実行しようとするObservable.Amb演算子です。したがって、Wait()は、IObservable<string>をobservableによって生成された最後の値に基づいてstringに単純に変換します。オブザーバブルは、取得したすべての値のみを生成するためです。

+0

私はそれがasp.netで私の最初の試みだと言ったように、申し訳ありません私はあなたの答えを理解できない場合、私もコピーし、上記のコードに私のコードにこれらのコードを貼り付ける、 * CS0103:内容の中に 'Observable'という名前は有効ではありません。*私の言語から英語への翻訳に感謝します。 –

+0

@ G.KISA - あなたはNuGet "Rx-Main"ですか?一度これを行うと、正しい名前空間を追加する必要がありますが、うまくいくはずです。 – Enigmativity