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 выконвае абмежаваны асінхронны ўвод/вывад і вяртае адзін вынік; ён не кіруе элементамі кіравання з фонавага патоку. ShowResults і ShowCheckError — метады праграмы.

Звычайнае працягванне await вяртаецца ў кантэкст UI, дзе пачаўся апрацоўшчык, таму ShowResults можа абнаўляць элементы кіравання. Код, які відавочна выконваецца ў іншым патоку, павінен перадаваць доступ да элементаў кіравання праз падтрымоўваны механізм WinForms.

Спіс бясплатных проксі можа даць адрасы для ўводу; перадавайце толькі пратаколы, рэалізаваныя CheckProxyAsync. Восем — гэта прыклад бюджэту. Наступная пачка чакае найпавольнейшую праверку ў бягучай пачцы, абменьваючы частку прапускной здольнасці на абмежаванае стварэнне задач. Захоўвайце тэрміны кожнай праверкі і адмену ў CheckProxyAsync; чаканне пачкі не можа прымусіць неабмежаваную сеткавую аперацыю завяршыцца.

Падобныя артыкулы