C# 如何在不等待其他操作完成的情况下更新视图
假设我有一个带有多个标签的GroupBox。在这些标签中,将显示各种与IP相关的信息。一个信息是机器的外部IP地址C# 如何在不等待其他操作完成的情况下更新视图,c#,C#,假设我有一个带有多个标签的GroupBox。在这些标签中,将显示各种与IP相关的信息。一个信息是机器的外部IP地址 string externalIP = ""; try { WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); request.Timeout = 3000; System.Threading.Tasks.Task<System.Net.WebResponse&g
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();
}
在getExternalIPv4()之后如何执行代码,即使它尚未完成?它可以在设置超时时工作,就像我上面所做的那样,但有时请求只需要稍长的时间,但仍然成功完成。因此,我希望仍然能够显示外部IP,但继续执行刷新GroupBox的其他方法。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事件方法
,并在其中包含要并行执行的代码;另外,writeLabel
作为RunWorkerCompleted事件(编辑标签而不引发多线程相关错误时需要)。即:
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;
}
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;
}