Dylai'r botwm Canslo stopio'r rhediad. Os yw pob gwiriad proxy yn dal y canslo ac yn dychwelyd yn normal, mae'r ddolen allanol yn symud ymlaen i'r proxy nesaf. Yna mae'r sgrin yn edrych fel pe na bai Canslo wedi gwneud dim.

Mewn .NET WinForms modern, cadwch un ffynhonnell fel maes ffurflen a gadewch i'r canslo gyrraedd y triniwr digwyddiad:

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 yw'r rhestr URI proxy sydd eisoes wedi'i pharsio yn y rhaglen. Gall rhesi o'r rhestr proxy am ddim fwydo gwiriad cyhoeddus a ganiateir; cadwch y protocol a defnyddiwch dim ond mathau mae'r triniwr hwn yn eu cefnogi. Mae'r UI yn aros ar gyfer pob gweithrediad, felly mae'r ddolen negeseuon yn parhau'n rhydd i dderbyn y clic canslo.

Cariwch y tocyn i'r rhwydwaith

Rhaid i'r gwiriad unigol dderbyn y tocyn hwnnw. Gall gwiriad HTTP byr edrych fel hyn:

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);
}

Mae probeUri a RecordResult yn perthyn i'r gwirydd presennol. Cadwch derfyn priodol ar faint yr ymateb ac amser aros ar gyfer y pwynt terfyn hwn. Gall gwirydd cynhyrchu ailddefnyddio cleientiaid fesul llwybr; mae'r darn yn dangos lle mae canslo yn teithio, nid dyluniad pwll cysylltiadau.

Os dylid cofnodi a hepgor proxys sydd wedi methu, deliwch â methiannau rhwydwaith disgwyliedig o amgylch y gwiriad unigol. Gadewch i ganslo'r rhediad ddianc i'r triniwr allanol. Ar gyfer gwiriadau cyfochrog, rhannwch docyn y rhediad gyda phob gweithiwr ac arhoswch iddynt orffen cyn galluogi rhediad arall.

Erthyglau cysylltiedig