[英]Check internet asynchronously in C# / ASP.NET
我的应用程序需要一些网站才能正常运行。 因此,我想使用ping / webclient检查网站,但执行过程可能需要花费几秒钟。 该代码可以异步运行,但是我希望在单击登录按钮之前结束该代码。
我的代码是:
//CheckWebService method is used to check if all websites are active
public static void CheckWebService()
{
try
{
WebClient WebClient = new WebClient();
WebClient.OpenRead("https://www.website1.com");
WebClient.OpenRead("https://www.website2.com");
WebClient.OpenRead("https://www.website3.com");
WebClient.OpenRead("https://www.website4.com");
}
catch (Exception Ex)
{
MessageBox.Show("Internet issues");
}
}
//This task is made public so that I can start it in Form load event, and can wait for it to compete in my login button click event.
Task CheckWebService;
private void LoginForm_Load(object sender, EventArgs e)
{
CheckWebService = Task.Run(() =>
{
CheckWebService();
});
}
private void LoginButton_Click(object sender, EventArgs e)
{
CheckWebService.Wait();
//Login verification code. CheckWebService method must be complete before login code executes.
}
我这样做正确吗?
您正在使用一些相当古老的技术并创建不必要的线程。 如果使事件处理程序异步,则要简单得多,如下所示:
private async void LoginForm_Load(object sender, EventArgs e)
{
await CheckWebService();
}
另外,HttpClient更现代,并具有异步方法:
public async Task CheckWebService()
{
try
{
using (var client = new HttpClient())
{
await client.GetAsync("https://www.website1.com");
await client.GetAsync("https://www.website2.com");
await client.GetAsync("https://www.website3.com");
await client.GetAsync("https://www.website4.com");
}
}
catch (HttpRequestException Ex)
{
MessageBox.Show("Internet issues");
}
}
这是基本的变化。 另外,您可能希望并行执行请求,以缩短响应时间。 另外,您可能要检查服务中的响应代码。 同样,您应该只捕获代码可以处理的特定异常; 如果出现系统错误(例如内存不足),您希望它冒泡。
这是您要做的所有事情:
public async Task CheckWebService()
{
bool success = false;
try
{
using (var client = new HttpClient())
{
var tasks = new[]
{
client.GetAsync("http://website1.com"),
client.GetAsync("http://website2.com"),
client.GetAsync("http://website3.com"),
client.GetAsync("http://website4.com"),
};
await Task.WhenAll(tasks);
var results = tasks.Select(t => t.Result).ToList();
if (results.All(r => r.StatusCode == System.Net.HttpStatusCode.OK))
{
success = true;
}
}
}
catch (HttpRequestException exception)
{
}
if (!success) MessageBox.Show("Error");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.