2017-01-14 3 views
-1

Ich versuche, eine Klasse zu erstellen, die eine Zeichenfolge in einer Liste von Websites auf eine asynchrone Weise durchsuchen kann.Async & Tasks - Durchsuchen einer Liste von Websites

Der folgende Code funktioniert, aber ich bin ein Gefühl bekommen, dass es völlig falsch gemacht hat: var t = new Task<Task<SearchResult>>(() => SearchWebsiteAsync(url, str));

Gibt es sind:

public static class Searcher 
    { 

     public struct SearchResult 
     { 
      public SearchResult(string Url, bool Found) 
      { 
       this.Url = Url; 
       this.Found = Found; 
      }    

      public string Url; 
      public bool Found; 
     } 

     public async static Task<SearchResult> SearchWebsiteAsync(string url, string str) 
     { 
      HttpClient client = new HttpClient(); 
      var urlContents = await client.GetStringAsync(url); 

      System.Console.WriteLine("Found string in website {0}", url); 
      bool foundString = (urlContents.Contains(str) ? true : false); 

      return new SearchResult(url, foundString); 
     } 

     public static async Task<IEnumerable<SearchResult>> StartSearch(string str) 
     { 
      List<SearchResult> results = new List<SearchResult>(); 
      List<Task<SearchResult>> taskList = new List<Task<SearchResult>>(); 

      foreach (var url in TheWeb.URLs) 
      { 
       System.Console.WriteLine("Searching URL {0}", url); 

       var t = new Task<Task<SearchResult>>(() => SearchWebsiteAsync(url, str)); 
       t.Start(); 
       taskList.Add(t.Result); 
      } 
      //Task.WaitAll(tasks.ToArray()); 

      foreach (var task in taskList) { 
       results.Add(task.Result); 
      }    

      return results; 
     } 
    } 

Vor allem, dass ich Task ‚s innerhalb Task‘ s haben einen besseren Weg (wenn möglich ohne Parallel, weil ich immer noch versuche, ein Verständnis von async-erwarten und Aufgaben)

+0

Wenn der Code funktioniert, dann ist dies besser geeignet für [code review] (https://codereview.stackexchange.com/) Website, was dies zu einer off-top-Frage macht. – Nkosi

+1

'HttpClient' s sind so konzipiert, wiederverwendet werden und relativ langlebig; Erstellen Sie keine neue für jede Anfrage. – sellotape

Antwort

2

Von was ich in Ihrem Code verstehe, ist es nicht wirklich Egal welche Aufgabe die Suchergebnisse ergeben (da die url sowieso in Ihren Suchergebnissen enthalten ist).

So wie etwa

public static async Task<SearchResult[]> StartSearch(string str) 
{ 
    List<Task<SearchResult>> taskList = new List<Task<SearchResult>>(); 

    foreach (var url in TheWeb.URLs) 
    { 
     System.Console.WriteLine("Searching URL {0}", url); 
     taskList.Add(SearchWebsiteAsync(url, str)); 
    } 

    return await Task.WhenAll<SearchResult>(taskList); 
} 

async Funktionen geben Task Objekte. Sie müssen new Task(() => {...}) nicht initialisieren. Ein Aufruf einer async Funktion genügt, um ein gültiges Task Objekt zurück zu bekommen.

Ich gehe hier davon aus, dass es Ihnen gut geht, alle Suchergebnisse gleichzeitig zu erhalten. Wenn diese Annahme falsch ist, lass es mich wissen. Es sind andere Lösungen möglich.

Verwandte Themen