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; המתנה לקבוצה אינה יכולה להשלים פעולת רשת בלתי מוגבלת.

מאמרים קשורים