Task.WaitAll 은 WinForms 클릭 처리기에서 검사 자체가 비동기 HTTP를 사용하더라도 창을 차단합니다. UI 스레드가 메시지를 처리할 수 없고, 캡처된 연속 작업이 같은 차단된 스레드를 필요로 할 수 있습니다.

.NET 6 이상에서는 대신 제한된 일괄 처리를 기다리세요.

private async void checkButton_Click(object sender, EventArgs e)
{
    checkButton.Enabled = false;
    try
    {
        var entries = proxyList.Lines
            .Where(line => !string.IsNullOrWhiteSpace(line));
        foreach (var batch in entries.Chunk(8))
        {
            var results = await Task.WhenAll(batch.Select(CheckProxyAsync));
            ShowResults(results);
        }
    }
    catch (Exception error)
    {
        ShowCheckError(error);
    }
    finally
    {
        checkButton.Enabled = true;
    }
}

이 코드는 System.Linq 과 System.Threading.Tasks 을 사용할 수 있는 기존 폼에 속합니다. CheckProxyAsync 은 제한된 비동기 I/O를 수행하고 결과 하나를 반환하며, 백그라운드 스레드에서 컨트롤을 조작하지 않습니다. ShowResults 과 ShowCheckError 은 애플리케이션 메서드입니다.

await 의 일반적인 연속 작업은 처리기가 시작된 UI 컨텍스트로 돌아오므로 ShowResults 이 컨트롤을 업데이트할 수 있습니다. 다른 스레드에서 명시적으로 실행되는 코드는 지원되는 WinForms 메커니즘을 통해 컨트롤 접근을 마샬링해야 합니다.

무료 프록시 목록 에서 입력 주소를 얻을 수 있습니다. CheckProxyAsync가 구현한 프로토콜만 전달하세요. 여덟은 예시 예산입니다. 다음 일괄 처리는 현재 일괄 처리에서 가장 느린 검사를 기다리므로 일부 처리량을 제한된 작업 생성과 맞바꿉니다. 각 검사의 기한과 취소를 CheckProxyAsync 안에 유지하세요. 일괄 처리를 기다린다고 해서 무제한 네트워크 작업이 끝나지는 않습니다.

관련 글