Peruuta koko WinForms-välityspalvelintarkistusajo
Pidä yksi peruutuslähde WinForms-välityspalvelintarkistusajolle, välitä peruutus HTTP-työhön ja pysäytä luettelon eteneminen.
Peruuta-painikkeen pitäisi pysäyttää ajo. Jos jokainen välityspalvelintarkistus nappaa peruutuksen ja palaa normaalisti, ulompi silmukka siirtyy vain seuraavaan välityspalvelimeen. Silloin näyttö näyttää siltä kuin Peruuta ei tekisi mitään.
Nykyaikaisessa .NET WinFormsissa pidä yksi lähde lomakekenttänä ja anna peruutuksen edetä tapahtumakäsittelijään:
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 on sovelluksen jo jäsennetty välityspalvelimen URI-luettelo. Rivit ilmaisten välityspalvelimien luettelosta voivat ruokkia sallittua julkisen kohteen tarkistusta; säilytä protokolla ja käytä vain tyyppejä, joita tämä käsittelijä tukee. Käyttöliittymä odottaa jokaista toimintoa, joten viestisilmukka pysyy vapaana vastaanottamaan peruutusnapsautuksen.
Vie tunniste verkkoon
Yksittäisen tarkistuksen on hyväksyttävä tämä tunniste. Lyhennetty HTTP-tarkistus voi näyttää tältä:
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 ja RecordResult kuuluvat olemassa olevaan tarkistajaan. Pidä sopiva vastauksen kokoraja ja aikakatkaisu tälle päätepisteelle. Tuotantotarkistaja voi käyttää asiakkaita uudelleen reitittäin; katkelma näyttää, minne peruutus kulkee, ei yhteyspoolin suunnittelua.
Jos epäonnistuneet välityspalvelimet pitää tallentaa ja ohittaa, nappaa odotetut verkkovirheet yksittäisen tarkistuksen ympäriltä. Anna ajon peruutuksen paeta ulompaan käsittelijään. Rinnakkaisissa tarkistuksissa jaa ajon tunniste jokaiselle työntekijälle ja odota niiden valmistumista ennen uuden ajon sallimista.