Σταματήστε το μπλοκάρισμα του WinForms όσο εκτελούνται έλεγχοι διακομιστών μεσολάβησης
Αντικαταστήστε το σύγχρονο 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 εκτελεί φραγμένη ασύγχρονη I/O και επιστρέφει ένα αποτέλεσμα· δεν χειρίζεται στοιχεία ελέγχου από νήμα υποβάθρου. Τα ShowResults και ShowCheckError είναι μέθοδοι της εφαρμογής.
Η κανονική συνέχιση του await επιστρέφει στο πλαίσιο UI όπου ξεκίνησε ο χειριστής, επομένως το ShowResults μπορεί να ενημερώσει στοιχεία ελέγχου. Κώδικας που εκτελείται ρητά σε άλλο νήμα πρέπει να δρομολογεί την πρόσβαση στα στοιχεία ελέγχου μέσω του υποστηριζόμενου μηχανισμού WinForms.
Η δωρεάν λίστα διακομιστών μεσολάβησης μπορεί να παρέχει διευθύνσεις εισόδου· περάστε μόνο πρωτόκολλα που υλοποιεί το CheckProxyAsync. Το οκτώ είναι ένα παράδειγμα προϋπολογισμού. Η επόμενη παρτίδα περιμένει τον πιο αργό έλεγχο στην τρέχουσα παρτίδα, ανταλλάσσοντας κάποια απόδοση με φραγμένη δημιουργία εργασιών. Διατηρήστε τις προθεσμίες κάθε ελέγχου και την ακύρωση μέσα στο CheckProxyAsync· η αναμονή μιας παρτίδας δεν μπορεί να ολοκληρώσει μια απεριόριστη δικτυακή λειτουργία.