ឈប់ធ្វើឱ្យ WinForms ជាប់ស្ទះ ពេលកំពុងដំណើរការពិនិត្យប្រូកស៊ី
ជំនួស Task.WaitAll សមកាលកម្មនៅក្នុង UI event handler ដោយ batch មានដែនកំណត់ដែលរង់ចាំ បន្ទាប់មកធ្វើបច្ចុប្បន្នភាព control នៅក្នុង UI context ដែលបន្ត។
Task.WaitAll ក្នុង WinForms click handler ធ្វើឱ្យ window ជាប់ស្ទះ ទោះបីជាការពិនិត្យខ្លួនឯងប្រើ HTTP អសមកាលក៏ដោយ។ UI thread មិនអាចដំណើរការ message បានទេ ហើយ continuation ដែលចាប់បានអាចត្រូវការ thread ដែលជាប់ស្ទះដូចគ្នា។
សម្រាប់ .NET 6 ឬថ្មីជាងនេះ សូមរង់ចាំ batch មានដែនកំណត់ជំនួសវិញ៖
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;
}
}នេះជាកម្មសិទ្ធិរបស់ form ដែលមានស្រាប់ ដោយមាន System.Linq និង System.Threading.Tasks អាចប្រើបាន។ CheckProxyAsync ធ្វើ I/O អសមកាលកមានដែនកំណត់ ហើយត្រឡប់លទ្ធផលមួយ; វាមិនគ្រប់គ្រង control ពី background thread ទេ។ ShowResults និង ShowCheckError គឺជា method របស់ application។
continuation ធម្មតារបស់ await ត្រឡប់ទៅ UI context ដែល handler បានចាប់ផ្តើម ដូច្នេះ ShowResults អាចធ្វើបច្ចុប្បន្នភាព control។ កូដដែលដំណើរការច្បាស់លាស់នៅលើ thread ផ្សេង ត្រូវបញ្ជូនការចូលប្រើ control តាមយន្តការ WinForms ដែលគាំទ្រ។
បញ្ជីប្រូកស៊ីឥតគិតថ្លៃ អាចផ្តល់អាសយដ្ឋានបញ្ចូល; បញ្ជូនតែ protocol ដែល CheckProxyAsync អនុវត្តប៉ុណ្ណោះ។ ប្រាំបីគឺជាថវិកាឧទាហរណ៍។ batch បន្ទាប់រង់ចាំការពិនិត្យយឺតបំផុតក្នុង batch បច្ចុប្បន្ន ដោយដោះដូរទិន្នផលមួយផ្នែកសម្រាប់ការបង្កើត task មានដែនកំណត់។ រក្សាកាលកំណត់នៃការពិនិត្យនីមួយៗ និងការបោះបង់ នៅក្នុង CheckProxyAsync; ការរង់ចាំ batch មិនអាចធ្វើឱ្យប្រតិបត្តិការបណ្តាញគ្មានដែនកំណត់បញ្ចប់បានទេ។