Как перебрать "Задачу" "в C#? - PullRequest
0 голосов
/ 07 мая 2020

Я работаю с C# спустя долгое время, и я пытаюсь понять, как выполнить итерацию объекта Task<List<User>>.

var productsTask = Execute(clientIds.ToList(), lc, this._getFaultPolicy,
                   (ct, batch) => mapper.FetchAsync<User>(selectStatement, batch), "GetAsyncCall");

Здесь productsTask имеет тип - Task<List<User>> productsTask. Я попытался осмотреться, но не мог понять, как повторить это и распечатать каждый объект User? Я думал сделать вот так, но это дает очевидную ошибку:

foreach (var s in productsTask)
{

}

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Вам нужно await ваш вызов или использовать productTask.Result.

будет выглядеть так в методе:

public async Task GetProductTask(){
        var productsTask = await Execute(clientIds.ToList(), lc, this._getFaultPolicy,
               (ct, batch) => mapper.FetchAsync<User>(selectStatement, batch), "GetAsyncCall");

        foreach(var products in productsTask){
             // do something
        }
} 

или используя .Result:

public void GetProductTask(){
        var productsTask = Execute(clientIds.ToList(), lc, this._getFaultPolicy,
               (ct, batch) => mapper.FetchAsync<User>(selectStatement, batch), "GetAsyncCall");

        foreach(var products in productsTask.Result){
             // do something
        }
} 

подробнее здесь: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

0 голосов
/ 08 мая 2020

await - это оператор. Вы можете использовать этот оператор везде, где у вас есть асинхронная операция (обычно Task), и вы хотите получить ее результат.

foreach (var s in await productsTask)
{

}

Конечно, чтобы иметь возможность использовать оператор await, вам необходимо быть внутри метода, отмеченного модификатором async.

0 голосов
/ 07 мая 2020

Похоже, у вас в игре async / await. Как предложил @Gabriel Luci, прочтите, пожалуйста, об async / await-программировании (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/), потому что это важно для вас, чтобы продолжить работу с кодом и понять, «что происходит»

Но ответ на ваш вопрос просто:

var products = await Execute(
                      clientIds.ToList(),
                      lc,
                      this._getFaultPolicy,
                      (ct, batch) => mapper.FetchAsync<User>(selectStatement, batch),
                      "GetAsyncCall"
                   )
                   .ConfigureAwait(false);

foreach(var product in products)
{
    //Do what you need here
}

Фрагмент .ConfigureAwait особенно важен, если вы создаете, например, приложение WinForms. Для консольного приложения это не имеет значения. Это связано с термином "SynchronizationContext". Подробнее об этом топе c можно прочитать здесь:

https://medium.com/bynder-tech/c-why-you-should-use-configureawait-false-in-your-library-code-d7837dce3d7f

и

https://devblogs.microsoft.com/dotnet/configureawait-faq/

Это не обязательно, но точно "приятно иметь" до сих пор, вы полностью уверены, вам это не нужно :)

...