Դադարեցրեք WinForms-ի արգելափակումը, մինչ պրոքսի ստուգումները ընթանում են
Փոխարինեք UI իրադարձության մշակիչում գտնվող սինխրոն Task.WaitAll-ը սպասվող, սահմանափակ խմբաքանակներով, ապա թարմացրեք կառավարիչները վերսկսված UI համատեքստում։
Task.WaitAll WinForms-ի սեղմման մշակիչում արգելափակում է պատուհանը նույնիսկ այն դեպքում, երբ ստուգումներն իրենք օգտագործում են ասինխրոն HTTP։ UI հոսքը չի կարող մշակել հաղորդագրությունները, և գրավված շարունակություններին կարող է անհրաժեշտ լինել այդ նույն արգելափակված հոսքը։
.NET 6 կամ ավելի նոր տարբերակում սպասեք սահմանափակ խմբաքանակի.
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-ը կատարում է սահմանափակ ասինխրոն I/O և վերադարձնում մեկ արդյունք. այն չի կառավարում տարրերը ֆոնային հոսքից։ ShowResults-ը և ShowCheckError-ը հավելվածի մեթոդներ են։
await-ի սովորական շարունակությունը վերադառնում է այն UI համատեքստ, որտեղ սկսվել է մշակիչը, ուստի ShowResults-ը կարող է թարմացնել կառավարիչները։ Այլ հոսքում բացահայտ աշխատող կոդը պետք է կառավարիչների հասանելիությունը փոխանցի աջակցվող WinForms մեխանիզմի միջոցով։
Անվճար պրոքսիների ցանկը կարող է տրամադրել մուտքային հասցեներ. փոխանցեք միայն CheckProxyAsync-ի կողմից իրականացված արձանագրությունները։ Ութը օրինակային բյուջե է։ Հաջորդ խմբաքանակը սպասում է ընթացիկ խմբաքանակի ամենադանդաղ ստուգմանը՝ փոխանակելով որոշ թողունակություն սահմանափակ առաջադրանքների ստեղծման հետ։ Պահեք յուրաքանչյուր ստուգման ժամկետները և չեղարկումը CheckProxyAsync-ի ներսում. խմբաքանակին սպասելը չի կարող ավարտել անսահմանափակ ցանցային գործողությունը։