2017-11-26 3 views
-1

Ich arbeite an einem Code, der regelmäßig eine Webseite für ein Bild scannt, die Pixelfarben des Bildes scannt und, wenn eine Farbe gefunden wird, asynchron mit einer Web-API verbindet.RunAsync() korrekt implementieren

Ich habe herausgefunden, wie man das Farbscannen und die Verbindung getrennt macht und jetzt muss ich die beiden Logiken verbinden, aber ich bin mir nicht sicher, wie es am besten geht.

Die Scan-Web-Seite/Bild-Scan-Code ist im Wesentlichen aus:

static void Main(string[] args) 
{ 
    while (true) 
    { 
     try 
     { 
       System.Threading.Thread.Sleep(5000); //refresh speed 

       string color = ReadColor(driver, webElement); 

       if (color== "blue") 
       { 
        //should connect for blue case and run the Blue() function below 
       } 
       if (color== "green") 
       { 
        //should connect for green case 
       } 
      } 
      catch 
      { 

      } 
     }   
    } 

die Httpclient Verbindung so geht:.

static HttpClient client = new HttpClient(); 

static void Main() 
{ 
      RunAsync().Wait(); 
} 

    static async Task RunAsync() 
    { 
     client.BaseAddress = new Uri("website"); 

      Data data = new Data { }; 

     try 
     { 

      data = await Green(); 
      data = await blue(); //functions to run depending on color 
     } 
     catch (Exception e) 
     { 

     } 

    } 

wie sollte die RunAsync(), wait(); Methode wird im ersten Beispiel korrekt eingefügt und wie soll ich die richtige Funktion aufrufen?

EDIT:

ok so schließlich ich es auf diese Weise tun:

static void Main(string[] args) 
    { 
     while (true) 
     { 
      try 
      { 

       System.Threading.Thread.Sleep(1000); 

       string signal = ReadGraph(driver, webElement); //////READ CHART 

       if (signal == "blue") 
       { 
        Task.Run(async() => await RunAsync(signal)).Wait(); 
       } 

       if (signal == "green") 
       { 
        RunAsync(signal); 
       } 
      } 
      catch 
      { 

      } 
     }   
    } 

jedoch, wenn die RunAsync genannt wird, führt es aber der Faden nie zur Hauptschleife zurück. Ich versuchte

Task.Run(async() => await RunAsync(signal)).Wait() 
Task.Run(async() => await RunAsync(signal)).Wait() 
RunAsync(signal); 
RunAsync(signal).wait(); 

mit dem gleichen Ergebnis, was mache ich falsch?

+0

Aufruf 'RunAsync() Warten()' ist eine solche Verschwendung. Warum haben Sie nicht einfach eine 'Run'-Methode, wenn Sie einen Async asynchronisieren? – Enigmativity

+0

danke @Enigmatismus Ich habe ein Update mit meinen Versuchen gepostet, da ich nicht ganz sicher bin, wie man das macht – user289829

+0

Verwenden Sie '.Wait()' nicht. Wenn Sie es tun, ist es sinnlos, Async zu verwenden. – Enigmativity

Antwort

0

Dies ist, wie Sie es tun sollten, wenn Sie async wollen.

static async void Main(string[] args) 
{ 
    while (true) 
    { 
     await Task.Delay(TimeSpan.FromSeconds(1.0)); 
     string signal = ReadGraph(driver, webElement); 
     if (signal == "blue") 
     { 
      await RunAsync(signal); 
     } 
     if (signal == "green") 
     { 
      await RunAsync(signal); 
     } 
    } 
} 
Verwandte Themen