Престаните да блокирате WinForms док провере proxy раде
Замените синхрони Task.WaitAll у UI обрађивачу догађаја чеканим, ограниченим серијама, а затим ажурирајте контроле у настављеном 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 обавља ограничени асинхрони улаз и излаз и враћа један резултат; не управља контролама из позадинске нити. ShowResults и ShowCheckError су методе апликације.
Уобичајени наставак await враћа се у UI контекст у ком је обрађивач почео, па ShowResults може да ажурира контроле. Код који експлицитно ради на другој нити мора да проследи приступ контролама кроз подржани WinForms механизам.
Листа бесплатних proxy може да обезбеди улазне адресе; проследите само протоколе које имплементира CheckProxyAsync. Осам је пример буџета. Следећа серија чека најспорију проверу у тренутној серији, размењујући део пропусности за ограничено стварање задатака. Задржите рокове сваке провере и отказивање у CheckProxyAsync; чекање серије не може да доврши неограничену мрежну операцију.