Kitufe cha Ghairi kinapaswa kusimamisha mzunguko. Ikiwa kila ukaguzi wa proksi unakamata kughairi na kurudi kawaida, mzunguko wa nje unapita tu kwenye proksi inayofuata. Wakati huo skrini inaonekana kana kwamba Ghairi haikufanya kitu.

Katika .NET WinForms ya kisasa, weka chanzo kimoja kama sehemu ya fomu na uache kughairi kufikia mshughulikiaji wa tukio:

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 ni orodha ya URI za proksi ambazo programu imechanganua tayari. Safu kutoka orodha ya proksi bure zinaweza kulisha ukaguzi unaoruhusiwa wa lengo la umma; hifadhi itifaki na tumia tu aina zinazoungwa mkono na mshughulikiaji huyu. UI inasubiri kila operesheni, kwa hivyo mzunguko wa ujumbe unabaki huru kupokea mbofyo wa kughairi.

Peleka tokeni hadi mtandao

Ukaguzi wa mtu mmoja unapaswa kukubali tokeni hiyo. Ukaguzi wa HTTP uliofupishwa unaweza kuonekana hivi:

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 na RecordResult ni za kikagua kilichopo. Weka kikomo kinachofaa cha ukubwa wa jibu na muda wa kusubiri kwa mwisho huu. Kikagua cha uzalishaji kinaweza kutumia tena wateja kwa njia; kipande kinaonyesha kughairi kunakwenda wapi, si muundo wa bwawa la miunganisho.

Ikiwa proksi zilizoshindwa zinapaswa kurekodiwa na kurukwa, kamata hitilafu za mtandao zinazotarajiwa karibu na ukaguzi wa mtu mmoja. Acha kughairi kwa mzunguko kutoka hadi mshughulikiaji wa nje. Kwa ukaguzi sambamba, shiriki tokeni ya mzunguko na kila mfanyakazi na subiri wakamilishe kabla ya kuwezesha mzunguko mwingine.

Makala zinazohusiana