proxy පරීක්ෂණ ක්රියාත්මක වන අතරතුර WinForms අවහිර කිරීම නවත්වන්න
UI සිදුවීම් හසුරුවන handler තුළ ඇති synchronous Task.WaitAll එක awaited, සීමිත කාණ්ඩ සමඟ ප්රතිස්ථාපනය කර, පසුව නැවත ආරම්භ වූ UI context තුළ controls යාවත්කාලීන කරන්න.
WinForms click handler තුළ Task.WaitAll කවුළුව අවහිර කරයි, පරීක්ෂණම asynchronous HTTP භාවිත කළත්. UI thread ට පණිවිඩ සැකසිය නොහැක, සහ ග්රහණය කළ continuation වලට එම අවහිර කළ thread අවශ්ය විය හැක.
.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 ලබා ගත හැකි පවතින form එකකට අයත් වේ. CheckProxyAsync සීමිත asynchronous ආදානය සහ ප්රතිදානය සිදු කර එක් ප්රතිඵලයක් ලබා දෙයි; එය background thread එකකින් controls හසුරුවන්නේ නැත. ShowResults සහ ShowCheckError යනු application ක්රම වේ.
await හි සාමාන්ය continuation, handler ආරම්භ වූ UI context වෙත නැවත පැමිණේ, එබැවින් ShowResults ට controls යාවත්කාලීන කළ හැක. වෙනත් thread එකක පැහැදිලිව ක්රියාත්මක වන code, සහාය දක්වන WinForms යාන්ත්රණය හරහා control ප්රවේශය යැවිය යුතුය.
නොමිලේ proxy ලැයිස්තුව ආදාන ලිපින සපයා ගත හැක; CheckProxyAsync ක්රියාත්මක කරන ප්රොටෝකෝල පමණක් යවන්න. අටක් යනු උදාහරණ අයවැයකි. ඊළඟ කාණ්ඩය වර්තමාන කාණ්ඩයේ ඉතා මන්දගාමී පරීක්ෂණය එනතුරු බලා සිටී, සීමිත task නිර්මාණය සඳහා යම් throughput මාරු කරයි. එක් එක් පරීක්ෂණයේ කාලසීමා සහ cancellation CheckProxyAsync තුළ තබා ගන්න; කාණ්ඩයක් await කිරීමෙන් අසීමිත ජාල ක්රියාවක් අවසන් කළ නොහැක.