כפתור ביטול אמור לעצור את הריצה. אם כל בדיקת פרוקסי לוכדת את הביטול וחוזרת כרגיל, הלולאה החיצונית פשוט עוברת לפרוקסי הבא. אז המסך נראה כאילו ביטול לא עשה דבר.

ב-.NET WinForms מודרני, שמרו מקור אחד כשדה טופס ותנו לביטול להגיע למטפל האירוע:

private CancellationTokenSource? activeRun;

private async void startButton_Click(object sender, EventArgs e)
{
    if (activeRun is not null) return;
    using var run = new CancellationTokenSource();
    activeRun = run;
    startButton.Enabled = false;
    try
    {
        foreach (Uri proxy in configuredProxies)
        {
            run.Token.ThrowIfCancellationRequested();
            await CheckProxyAsync(proxy, run.Token);
        }
        statusLabel.Text = "Finished";
    }
    catch (OperationCanceledException) when (run.IsCancellationRequested)
    {
        statusLabel.Text = "Stopped";
    }
    finally
    {
        activeRun = null;
        startButton.Enabled = true;
    }
}

private void cancelButton_Click(object sender, EventArgs e)
    => activeRun?.Cancel();

configuredProxies הוא רשימת כתובות ה-URI של הפרוקסי שהאפליקציה כבר ניתחה. שורות מרשימת הפרוקסי החינמי יכולות להזין בדיקה מורשית של יעד ציבורי; שמרו על הפרוטוקול והשתמשו רק בסוגים שהמטפל הזה תומך בהם. ממשק המשתמש ממתין לכל פעולה, ולכן לולאת ההודעות נשארת פנויה לקבלת לחיצת הביטול.

העבירו את האסימון לרשת

הבדיקה הבודדת חייבת לקבל את האסימון הזה. בדיקת HTTP מקוצרת יכולה להיראות כך:

private async Task CheckProxyAsync(Uri proxy, CancellationToken token)
{
    using var handler = new HttpClientHandler
    {
        Proxy = new System.Net.WebProxy(proxy),
        UseProxy = true
    };
    using var client = new HttpClient(handler);
    using var response = await client.GetAsync(
        probeUri, HttpCompletionOption.ResponseHeadersRead, token);
    response.EnsureSuccessStatusCode();
    string body = await response.Content.ReadAsStringAsync(token);
    RecordResult(proxy, body);
}

probeUri ו-RecordResult שייכים לבדוק הקיים. שמרו מגבלת גודל תגובה מתאימה וזמן קצוב לנקודת קצה זו. בודק ייצור יכול לעשות שימוש חוזר בלקוחות לפי מסלול; הקטע מראה לאן הביטול נוסע, לא תכנון של מאגר חיבורים.

אם יש לתעד ולדלג על פרוקסי שנכשלו, תפסו כשלי רשת צפויים סביב הבדיקה הבודדת. תנו לביטול הריצה להימלט אל המטפל החיצוני. לבדיקות מקבילות, שתפו את אסימון הריצה עם כל עובד והמתינו להשלמתם לפני הפעלת ריצה נוספת.

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