הערט אויף בלאָקירן WinForms ווען proxy־פּרובירן לויפֿן
פֿאַרבייַט אַ סינכראָנע Task.WaitAll אין דעם UI־געשעעניש־באַהאַנדלער מיט געוואַרטע, באַגרענעצטע פּאַרטשעס, און דערנאָך דערהיינטיקט די קאָנטראָלן אין דעם צוריקגעשטעלטן UI־קאָנטעקסט.
Task.WaitAll אין אַ WinForms קליק־באַהאַנדלער בלאָקירט דאָס פֿענצטער אַפֿילו ווען די פּרובירן אַליין ניצן אַסינכראָנע HTTP. דער UI־פֿאָדעם קען נישט פּראָצעסירן מעלדונגען, און אָפּגעכאַפּטע continuation קענען דאַרפֿן דעם זעלביקן בלאָקירטן פֿאָדעם.
פֿאַר .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 טוט באַגרענעצטע אַסינכראָנע אַרייַננעמען און אַרויסנעמען און גיט צוריק איין רעזולטאַט; זי מאַניפּולירט נישט קאָנטראָלן פֿון אַ הינטערגרונט־פֿאָדעם. ShowResults און ShowCheckError זענען אַפּליקאַציע־מעטאָדן.
דער נאָרמאַלער await־continuation קומט צוריק צום UI־קאָנטעקסט וווּ דער באַהאַנדלער האָט זיך אָנגעהויבן, אַזוי ShowResults קען דערהיינטיקן קאָנטראָלן. קאָד וואָס לויפֿט בפֿירוש אויף אַן אַנדער פֿאָדעם מוז דורכגעבן קאָנטראָל־צוטריט דורך דעם געשטיצטן WinForms־מעכאַניזם.
די ליסטע פֿון פֿרײַע proxy קען צושטעלן אַרייַנגאַנג־אַדרעסן; שיקט נאָר פּראָטאָקאָלן וואָס CheckProxyAsync פֿירט אויס. אַכט איז אַ בייַשפּיל־בודזשעט. דער ווייַטער פּאַרטש וואַרט אויף דער פּאַמעלסטער פּרובירונג אין דעם איצטיקן פּאַרטש, און פֿאַרבייַט אַ טייל דורכפֿלוס פֿאַר באַגרענעצטער שאַפֿונג פֿון אויפֿגאַבן. האַלט די טערמינען פֿון יעדער פּרובירונג און אָפּזאָג אין CheckProxyAsync; וואַרטן אויף אַ פּאַרטש קען נישט מאַכן אַן אומבאַגרענעצטע נעץ־אָפּעראַציע פֿאַרטיק.