Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

536
Views
Espere todas las tareas del diccionario y obtenga resultados, incluida la clave del diccionario

Tengo que modificar el siguiente código. He dado una lista de tareas (el método httpClient.Run devuelve Task). Tengo que ejecutarlos y esperar hasta que todos estén listos. Más tarde, necesito recopilar todos los resultados y generar una respuesta.

 var tasks = new Dictionary<string, Task<string>>(); tasks.Add("CODE1", service.RunTask("CODE1")); tasks.Add("CODE2", service.RunTask("CODE2")); tasks.Add("CODE3", service.RunTask("CODE3")); //... var result = await Task.WhenAll(tasks.Values); // how to get CODE (dictionary KEY) here // build response

El problema anterior es que cuando obtenemos results , hemos perdido exactamente qué tarea se ejecutó. resultados es una matriz de cadenas, pero necesito, por ejemplo, KeyValuePair array . Necesitamos saber qué tarea (CÓDIGO) se ejecutó, para que podamos generar el resultado correctamente.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Puede usar async en un Select lambda para transformar KeyValuePair<T1, Task<T2> s en Task<KeyValuePair<T1, T2>> s.

 var resultTasks = tasks.Select(async pair => KeyValuePair.Create(pair.Key, await pair.Value)); IReadOnlyCollection<KeyValuePair<string, string>> results = await Task.WhenAll(resultTasks);
over 4 years ago · Santiago Trujillo Report

0

Algo como esto debería hacerlo. Esto está escrito asumiendo que primero haces la llamada Task.WhenAll() . De lo contrario, bloqueará el hilo cuando comience a enumerar resultados con resultsWithKeys .

 await Task.WhenAll(tasks.Values()); var resultsWithKeys = tasks.Select( x => new { Key = x.Key, Result = x.Value.Result }); foreach (var result in resultsWithKeys) Console.WriteLine($"{result.Key} - {result.Result.SomeValue}");
over 4 years ago · Santiago Trujillo Report

0

Dictionary<string, Task<string>> contiene tareas que no propagan la clave como parte de su Result . Si prefiere tener tareas que incluyan la clave en su resultado, deberá crear un nuevo diccionario y llenarlo con nuevas tareas que envuelvan las tareas existentes. El TResult de estas nuevas tareas puede ser una estructura de su elección, por ejemplo, KeyValuePair<string, string> . A continuación se muestra un método de extensión WithKeys que permite crear fácilmente el nuevo diccionario con las nuevas tareas:

 public static Dictionary<TKey, Task<KeyValuePair<TKey, TValue>>> WithKeys<TKey, TValue>( this Dictionary<TKey, Task<TValue>> source) { return source.ToDictionary(e => e.Key, async e => KeyValuePair.Create(e.Key, await e.Value.ConfigureAwait(false)), source.Comparer); }

Ejemplo de uso:

 KeyValuePair<string, string>[] result = await Task.WhenAll(tasks.WithKeys().Values);
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!