ಪ್ರಾಕ್ಸಿ ಪರಿಶೀಲನೆಗಳು ನಡೆಯುತ್ತಿರುವಾಗ WinForms ಅನ್ನು ನಿರ್ಬಂಧಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ
UI ಈವೆಂಟ್ ಹ್ಯಾಂಡ್ಲರ್ನಲ್ಲಿರುವ ಸಿಂಕ್ರೊನಸ್ Task.WaitAll ಅನ್ನು ನಿರೀಕ್ಷಿಸಿದ, ಸೀಮಿತ ಬ್ಯಾಚ್ಗಳೊಂದಿಗೆ ಬದಲಾಯಿಸಿ, ನಂತರ ಮುಂದುವರೆದ UI ಸಂದರ್ಭದಲ್ಲಿ ನಿಯಂತ್ರಣಗಳನ್ನು ನವೀಕರಿಸಿ.
Task.WaitAll WinForms ಕ್ಲಿಕ್ ಹ್ಯಾಂಡ್ಲರ್ನಲ್ಲಿ ಪರಿಶೀಲನೆಗಳೇ asynchronous 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 ಸೀಮಿತ asynchronous I/O ಮಾಡುತ್ತದೆ ಮತ್ತು ಒಂದು ಫಲಿತಾಂಶವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ; ಇದು ಹಿನ್ನೆಲೆ ಥ್ರೆಡ್ನಿಂದ ನಿಯಂತ್ರಣಗಳನ್ನು ನಿರ್ವಹಿಸುವುದಿಲ್ಲ. ShowResults ಮತ್ತು ShowCheckError ಅಪ್ಲಿಕೇಶನ್ ವಿಧಾನಗಳು.
ಸಾಮಾನ್ಯ await continuation ಹ್ಯಾಂಡ್ಲರ್ ಪ್ರಾರಂಭವಾದ UI ಸಂದರ್ಭಕ್ಕೆ ಮರಳುತ್ತದೆ, ಆದ್ದರಿಂದ ShowResults ನಿಯಂತ್ರಣಗಳನ್ನು ನವೀಕರಿಸಬಹುದು. ಇನ್ನೊಂದು ಥ್ರೆಡ್ನಲ್ಲಿ ಸ್ಪಷ್ಟವಾಗಿ ಚಲಿಸುವ ಕೋಡ್ ಬೆಂಬಲಿತ WinForms ಕಾರ್ಯವಿಧಾನದ ಮೂಲಕ ನಿಯಂತ್ರಣ ಪ್ರವೇಶವನ್ನು ರವಾನಿಸಬೇಕು.
ಉಚಿತ ಪ್ರಾಕ್ಸಿ ಪಟ್ಟಿ ಇನ್ಪುಟ್ ವಿಳಾಸಗಳನ್ನು ಒದಗಿಸಬಹುದು; CheckProxyAsync ಅನುಷ್ಠಾನಗೊಳಿಸುವ ಪ್ರೋಟೋಕಾಲ್ಗಳನ್ನು ಮಾತ್ರ ರವಾನಿಸಿ. ಎಂಟು ಒಂದು ಉದಾಹರಣೆ ಬಜೆಟ್. ಮುಂದಿನ ಬ್ಯಾಚ್ ಪ್ರಸ್ತುತ ಬ್ಯಾಚ್ನ ನಿಧಾನವಾದ ಪರಿಶೀಲನೆಗಾಗಿ ಕಾಯುತ್ತದೆ, ಸ್ವಲ್ಪ ಥ್ರೂಪುಟ್ ಅನ್ನು ಸೀಮಿತ ಕಾರ್ಯ ರಚನೆಗೆ ವಿನಿಮಯ ಮಾಡುತ್ತದೆ. ಪ್ರತಿ ಪರಿಶೀಲನೆಯ ಗಡುವುಗಳನ್ನು ಮತ್ತು ರದ್ದತಿಯನ್ನು CheckProxyAsync ಒಳಗೆ ಇರಿಸಿ; ಬ್ಯಾಚ್ಗಾಗಿ ಕಾಯುವುದು ಅನಿಯಮಿತ ನೆಟ್ವರ್ಕ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.