proxy ਜਾਂਚਾਂ ਚੱਲਦਿਆਂ WinForms ਨੂੰ ਬਲਾਕ ਕਰਨਾ ਬੰਦ ਕਰੋ
UI ਇਵੈਂਟ ਹੈਂਡਲਰ ਵਿੱਚ synchronous Task.WaitAll ਨੂੰ awaited, ਸੀਮਤ ਬੈਚਾਂ ਨਾਲ ਬਦਲੋ, ਫਿਰ ਮੁੜ ਸ਼ੁਰੂ ਹੋਏ UI context ਵਿੱਚ controls ਅੱਪਡੇਟ ਕਰੋ।
WinForms ਕਲਿੱਕ ਹੈਂਡਲਰ ਵਿੱਚ 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 ਉਪਲਬਧ ਵਾਲੇ ਮੌਜੂਦਾ ਫਾਰਮ ਵਿੱਚ ਆਉਂਦਾ ਹੈ। CheckProxyAsync ਸੀਮਤ asynchronous ਇਨਪੁਟ ਅਤੇ ਆਉਟਪੁਟ ਕਰਦਾ ਹੈ ਅਤੇ ਇੱਕ ਨਤੀਜਾ ਦਿੰਦਾ ਹੈ; ਇਹ background thread ਤੋਂ controls ਨਹੀਂ ਚਲਾਉਂਦਾ। ShowResults ਅਤੇ ShowCheckError ਐਪਲੀਕੇਸ਼ਨ ਢੰਗ ਹਨ।
await ਦਾ ਆਮ continuation ਉਸ UI context ਵਿੱਚ ਵਾਪਸ ਆਉਂਦਾ ਹੈ ਜਿੱਥੇ ਹੈਂਡਲਰ ਸ਼ੁਰੂ ਹੋਇਆ ਸੀ, ਇਸ ਲਈ ShowResults controls ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ। ਕਿਸੇ ਹੋਰ thread ਉੱਤੇ ਸਪੱਸ਼ਟ ਤੌਰ ਉੱਤੇ ਚੱਲ ਰਹੇ code ਨੂੰ control ਪਹੁੰਚ ਸਮਰਥਿਤ WinForms ਵਿਧੀ ਰਾਹੀਂ ਭੇਜਣੀ ਚਾਹੀਦੀ ਹੈ।
ਮੁਫ਼ਤ proxy ਸੂਚੀ ਇਨਪੁਟ ਪਤੇ ਦੇ ਸਕਦੀ ਹੈ; ਸਿਰਫ਼ ਉਹ ਪ੍ਰੋਟੋਕੋਲ ਭੇਜੋ ਜੋ CheckProxyAsync ਲਾਗੂ ਕਰਦਾ ਹੈ। ਅੱਠ ਇੱਕ ਉਦਾਹਰਨ ਬਜਟ ਹੈ। ਅਗਲਾ ਬੈਚ ਮੌਜੂਦਾ ਬੈਚ ਦੀ ਸਭ ਤੋਂ ਹੌਲੀ ਜਾਂਚ ਦੀ ਉਡੀਕ ਕਰਦਾ ਹੈ, ਸੀਮਤ task ਬਣਾਉਣ ਲਈ ਕੁਝ throughput ਬਦਲਦਾ ਹੈ। ਹਰ ਜਾਂਚ ਦੀਆਂ ਸਮਾਂ-ਸੀਮਾਵਾਂ ਅਤੇ cancellation CheckProxyAsync ਵਿੱਚ ਰੱਖੋ; ਬੈਚ await ਕਰਨਾ ਬੇਸੀਮਤ ਨੈੱਟਵਰਕ ਕਾਰਵਾਈ ਨੂੰ ਪੂਰਾ ਨਹੀਂ ਕਰ ਸਕਦਾ।