د proxy د ازموینو پر مهال WinForms بندول ودروئ
په UI د پېښې په اداره کوونکي کې synchronous Task.WaitAll په انتظار شوو، محدودو ټولګو بدل کړئ، بیا controls په بیا پیل شوي UI context کې تازه کړئ.
په WinForms د کلیک په اداره کوونکي کې Task.WaitAll کړکۍ بندوي، حتی کله چې ازموینې پخپله asynchronous HTTP کاروي. د UI تار نشي کولی پیغامونه پروسس کړي، او نیول شوي continuation کېدای شي هماغه بند شوی تار ته اړتیا ولري.
د .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 تار څخه controls نه اداره کوي. ShowResults او ShowCheckError د اپلیکیشن میتودونه دي.
د await عادي continuation هغه UI context ته بېرته راځي چې اداره کوونکی پکې پیل شو، نو ShowResults کولی شي controls تازه کړي. هغه کوډ چې په ښکاره ډول په بل تار کې ځي باید د controls لاسرسی د WinForms د ملاتړ شوي میکانېزم له لارې ولېږي.
د وړیا proxy لیست کولی شي د ننوتلو پتې برابرې کړي؛ یوازې هغه پروتوکولونه ولېږئ چې CheckProxyAsync یې پلي کوي. اته یوه بېلګه بودیجه ده. بله ټولګه په اوسنۍ ټولګه کې ترټولو ورو ازموینې ته انتظار کوي، د محدود task جوړولو لپاره لږ throughput بدلوي. د هرې ازموینې مهالونه او cancellation په CheckProxyAsync کې وساتئ؛ د ټولګې انتظار نشي کولی یو بې حده شبکه عملیات بشپړ کړي.