Многократное ожидание потока - PullRequest
0 голосов
/ 25 июня 2018

Это на самом деле связано с моим предыдущим вопросом, и я вполне способен понять многократное ожидание.Я понял, что в асинхронном режиме можно ожидать, что await как «приостановка» метода async до завершения этой операции. Но я не могу понять 2 асинхронных.

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

Может кто-нибудь, пожалуйста, если вариант 1 хорош?

public  void CombineData()
{     
    //**Option1:**
     var MyData = await getCP1();
     var MyData2 = await getCP2();    
     var myobj = MyData.Id+ MyData2.Id;
    //**Option2:**
    var MyData = getCP1();
    var MyData2= getCP2();
    await Task.WhenAll(MyData , MyData2 );
    var myob_2option = MyData.Id+ MyData2.Id;
    }
     public  async Task<MyData> getCp1()
     {
                    var httpClient = GetHttpClient();
                    string requestEndpoint = "localhost/numbers/Get";

                    HttpResponseMessage httpResponse = await _httpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync(requestEndpoint));

                    IEnumerable<string> numbers = await httpResponse.Content.ReadAsAsync<IEnumerable<string>>();
                    return new InsuranceCompanyData();
                }
                public  async Task<MyData> getCP2()
                {
                    var httpClient = GetHttpClient();
                    string requestEndpoint = "localhost/numbers/Get";

                    HttpResponseMessage httpResponse = await _httpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync(requestEndpoint));

                    IEnumerable<string> numbers = await httpResponse.Content.ReadAsAsync<IEnumerable<string>>();
                    return new InsuranceCompanyData();
                }

                private static HttpClient GetHttpClient()
                {
                    var httpClient = new HttpClient();
                    httpClient.BaseAddress = new Uri(@"http://localhost:2351/api/");
                    httpClient.DefaultRequestHeaders.Accept.Clear();
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    return httpClient;
                }

1 Ответ

0 голосов
/ 25 июня 2018

Вариант 1:

Последовательность. Неважно, с await или без него, код в методе является последовательным, то есть: первая строка в методе выполняется, а вторая - только после завершения первой и возвращает управление вызывающему методу. Разница между тем, использовать его или нет, заключается в том, что поток, выполняющий ваш метод, будет доступен во время выполнения операции awaited. Это действительно полезно, если вы имеете дело с другой системой, т.е. с базой данных. Вы могли бы дождаться оператора SELECT, тем самым предотвращая блокировку потока, выполняющего метод с выбранным им, до тех пор, пока база данных не ответит.

Вариант 2:

параллелизм. Здесь вы последовательно создаете две задачи, а затем await для завершения всех из них с Task.WhenAll()

Так что это зависит от того, что вы ищете, первый вариант верен, если для вызова второго метода нужно что-то из первого. Если между ними нет зависимости, то вам нужен параллелизм, который достигается с помощью опции 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...