Я работаю над кодом, который регулярно делает снимки экрана веб-страницы для изображения, сканирует пиксельные цвета изображения и, если цвет найден, асинхронно подключается к веб-API.

Я разработал, как выполнять цветное сканирование и соединение по отдельности, и теперь мне нужно объединить две логики, но я не уверен, как это сделать лучше всего.

Код сканирования веб-страницы / изображения по существу таков:

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
            {

            }
        }        
    }

Соединение HttpClient выглядит так:

 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)
        {

        }

    }

Как следует RunAsync (). Wait (); метод должен быть правильно вставлен в первый пример и как мне вызвать правильную функцию?

РЕДАКТИРОВАТЬ:

Хорошо, в конце концов я делаю это так:

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
            {

            }
        }        
    }

Однако всякий раз, когда вызывается RunAsync, он выполняется, но поток никогда не возвращается в основной цикл. Я пытался

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

С тем же результатом, что я делаю не так?

-1
user289829 26 Ноя 2017 в 14:30

1 ответ

Лучший ответ

Вот как вы должны это сделать, если хотите async:

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);
        }
    }
}
0
Enigmativity 27 Ноя 2017 в 01:40