0

複数のラベルを持つ GroupBox があるとします。これらのラベルには、さまざまな IP 関連の情報が表示されます。1 つの情報は、マシンの外部 IP アドレスです。

string externalIP = "";

try
{
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    request.Timeout = 3000;
    System.Threading.Tasks.Task<System.Net.WebResponse> response =  request.GetResponseAsync();

    using (StreamReader stream = new StreamReader(response.Result.GetResponseStream()))
    {
        if (response.Result.ContentLength != -1)
        {
             externalIP = stream.ReadToEnd();
        }
    }               
}
catch (Exception e)
{
    externalIP = "Error.";
}

if (externalIP == "")
{
    return "No service.";
}
else
{
    return externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).Matches(externalIP)[0].ToString();
}

このメソッドは、次のコードから呼び出されます。

private void updateNetworkIP()
{ 
    string ip4e = "External IPv4: " + getExternalIPv4();
    lblIP4external.Text = ip4e;

    //Get some more info here.
}

getExternalIPv4() の後で、まだ終了していない場合でもコードを実行するにはどうすればよいですか? 上記のようにタイムアウトを設定すると機能しますが、リクエストに少し時間がかかる場合がありますが、それでも正常に完了します。したがって、外部 IP を表示できるようにしたいのですが、GroupBox を更新する他の方法を引き続き実行したいと考えています。

4

1 に答える 1

1

あなたBackgroundWorkerが求めているものを提供します。サンプルコード:

BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(getExternalIPv4Back);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(writeLabel);
bg.RunWorkerAsync();
//The code below this point will be executed while the BackgroundWorker does its work

として定義getExternalIPv4Backし、DoWork Event Methodその中に並列で実行するコードを含める必要があります。writeLabelとしてもRunWorkerCompleted Event使用できます (マルチスレッド関連のエラーを引き起こさずにラベルを編集するために必要です)。あれは:

private void getExternalIPv4Back(object sender, DoWorkEventArgs e)
{
    IP = "External IPv4: " + getExternalIPv4(); //IP -> Globally defined variable
}

private void writeLabel(object sender, RunWorkerCompletedEventArgs e)
{
   lblIP4external.Text = IP;
}
于 2013-08-17T11:50:52.417 に答える