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-ში; პარტიის ლოდინი ვერ დაასრულებს შეუზღუდავ ქსელურ ოპერაციას.

დაკავშირებული სტატიები