proxy சரிபார்ப்புகள் இயங்கும்போது WinForms-ஐத் தடுப்பதை நிறுத்துங்கள்
UI நிகழ்வு handler-இல் உள்ள synchronous Task.WaitAll-ஐ awaited, வரம்புடைய தொகுதிகளாக மாற்றி, பின்னர் மீண்டும் தொடங்கிய UI context-இல் controls-ஐப் புதுப்பிக்கவும்.
WinForms click handler-இல் Task.WaitAll, சரிபார்ப்புகள் தாமே asynchronous HTTP பயன்படுத்தினாலும் சாளரத்தைத் தடுக்கிறது. UI thread செய்திகளைச் செயலாக்க முடியாது, மேலும் பிடிக்கப்பட்ட continuation-களுக்கு அதே தடுக்கப்பட்ட thread தேவைப்படலாம்.
.NET 6 அல்லது அதற்குப் பிந்தையதற்கு, அதற்குப் பதிலாக வரம்புடைய தொகுதியை await செய்யுங்கள்:
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 கிடைக்கக்கூடிய ஏற்கனவே உள்ள form-க்கு உரியது. CheckProxyAsync வரம்புடைய asynchronous உள்ளீடு மற்றும் வெளியீட்டைச் செய்து ஒரு முடிவைத் திருப்பித் தருகிறது; இது background thread-இலிருந்து controls-ஐக் கையாள்வதில்லை. ShowResults மற்றும் ShowCheckError பயன்பாட்டு முறைகள்.
await-இன் சாதாரண continuation, handler தொடங்கிய UI context-க்குத் திரும்புகிறது, எனவே ShowResults controls-ஐப் புதுப்பிக்க முடியும். வேறு thread-இல் வெளிப்படையாக இயங்கும் code, ஆதரிக்கப்படும் WinForms வழிமுறையின் மூலம் control அணுகலை அனுப்ப வேண்டும்.
இலவச proxy பட்டியல் உள்ளீட்டு முகவரிகளை வழங்க முடியும்; CheckProxyAsync செயல்படுத்தும் நெறிமுறைகளை மட்டும் அனுப்புங்கள். எட்டு என்பது ஒரு எடுத்துக்காட்டு பட்ஜெட். அடுத்த தொகுதி தற்போதைய தொகுதியில் மிக மெதுவான சரிபார்ப்புக்காகக் காத்திருக்கிறது, வரம்புடைய task உருவாக்கத்திற்காக சிறிது throughput-ஐப் பரிமாறுகிறது. ஒவ்வொரு சரிபார்ப்பின் காலக்கெடுகளையும் cancellation-ஐயும் CheckProxyAsync-இல் வைத்திருங்கள்; ஒரு தொகுதியை await செய்வது வரம்பற்ற நெட்வொர்க் செயல்பாட்டை முடிக்கச் செய்யாது.