TSMGeorge Δημοσ. 5 Οκτωβρίου 2014 Δημοσ. 5 Οκτωβρίου 2014 Καλημέρα μάγκες! Έφτιαξα ένα "IPBoard Froum - Online Users Grabber". Δουλεύει άψογα με το Insomnia.gr, θα το δοκιμάσω και με άλλα Forums. Αυτό που όμως θέλω να ρωτήσω είναι:Πως μπορώ να το κάνω να τρέχει με σειρά; δηλαδή να το Parse(...) να περιμένει το webClient.DownloadString(...); δεν έχω ασχοληθεί με Tasks Grabber Class class Grabber { private List<string> xUsersList = new List<string>(); private string xHtmlData = ""; private string xUrl = ""; private string xPattern1 = ""; private string xPattern2 = ""; public Grabber(string url, string pattern1, string pattern2) { // Initiallization xUrl = url; xPattern1 = pattern1; xPattern2 = pattern2; // Download html data and parse for obtaining users ProcessInitiallizer(); } private void ProcessInitiallizer() { try { // Create request WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; xHtmlData = webClient.DownloadString(new Uri(xUrl)); // Parse html data ParseHtml(); } catch (Exception) { xUsersList.Clear(); xUsersList.Add("[Exception]: Can't download html source. Please Check your Internet Connection!"); } } private void ParseHtml() { // Parse Html Data - Phase 1 string[] xArray = Regex.Matches(xHtmlData, xPattern1) .Cast<Match>() .Select(m => m.Value) .ToArray(); // Remove Double Records xArray = xArray.Distinct().ToArray(); // Parse Html Data - Phase 2 foreach (string s in xArray) { var x = Regex.Match(s, xPattern2).ToString(); x = x.Remove(0, 1); x = x.Remove(x.Length - 1, 1); xUsersList.Add(x); } }//ParseHtml public List<string> GetUsers() { if (xUsersList.Count >= 1) { return xUsersList; } else { xUsersList.Add("GetUsers(): An error happened! There are no users!"); return xUsersList; } }//GetUsers } How to call it! void CallGrabber() { // List to save users & Patterns that we will pass to Grabber class List<string> listUsers = new List<string>(); string p1 = "href='http://www.insomnia.gr/user/\\d+\\-\\S+/'"; string p2 = "-.*/"; // Get Users Grabber grabber = new Grabber("http://www.insomnia.gr/index", p1, p2); listUsers = grabber.GetUsers(); //You got the list with online users... do whatever you want (some statics maby?) }
albNik Δημοσ. 5 Οκτωβρίου 2014 Δημοσ. 5 Οκτωβρίου 2014 Χρειάζεσαι την DownloadStringTaskAsync WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; Task<string> task = webClient.DownloadStringTaskAsync(new Uri(xUrl)); task.ContinueWith(t => Parse(task.Result)); Σε ΝΕΤ 4.5 υπαρχουν και οι async/await
TSMGeorge Δημοσ. 5 Οκτωβρίου 2014 Μέλος Δημοσ. 5 Οκτωβρίου 2014 Χρειάζεσαι την DownloadStringTaskAsync WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; Task<string> task = webClient.DownloadStringTaskAsync(new Uri(xUrl)); task.ContinueWith(t => Parse(task.Result)); Σε ΝΕΤ 4.5 υπαρχουν και οι async/await Το δοκίμασα αλλά κάτι δεν έκανα καλά και δεν έπαιρνα ποτέ το Html Source. PS: Το Project είναι σε 4.0, μπορώ να το κάνω Update/Upgrade χωρίς προβλήματα και χωρίς πολλές επεμβάσεις; void Function() { WebClient wc = new WebClient(); wc.DownloadStringAsync(); wc.DownloadStringAsyncCompleted += Event... } void Event(..., ...) { xHtmlData = e.Text; }
albNik Δημοσ. 5 Οκτωβρίου 2014 Δημοσ. 5 Οκτωβρίου 2014 Ναι γιατι η Task =... επιστρεφει αμεσως, Η ContinueWith θα εκτελεστει σε νεο thread μολις ερθουν τα δεδομένα. Αν ειναι console application θα κλεισει πριν ερθουν τα δεδομενα. Βαλε ενα Console.ReadLine() στο τελος. Η ουσια ειναι οτι δεν θα μπλοκαρεις περιμενοντας.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα