>

제 응용 프로그램이 제대로 작동하려면 몇 개의 웹 사이트가 필요합니다. 따라서 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.
}

이 작업을 올바르게 수행하고 있습니까?

  • 답변 # 1

    당신은 꽤 오래된 기술을 사용하고 불필요한 스레드를 만들고 있습니다. 이벤트 핸들러를 다음과 같이 비 동기화하면 훨씬 간단합니다 :

    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");
    }
    
    

  • 이전 중첩 루프 파이썬
  • 다음 javascript - iOS 및 Android에서 HTML5 비디오가 재생되지 않습니다