Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

356
Vistas
¿Cómo paralelizar/asincronizar este método?

Estoy tratando de escribir este código de manera que no bloquee el programa. client.Spot.Market.GetKlinesAsync admite la espera, pero no estoy seguro de cómo puedo estructurar el código para que pueda esperarse.

 public static async Task GetMinMaxValues ( BinanceClient client, ObservableCollection<Coin> coins ) { foreach ( var coin in coins ) { var task = client.Spot.Market.GetKlinesAsync ( coin.SymbolPair, KlineInterval.OneDay ); coin.MinVal = klines.Result.Data.Select ( k => k.Low ).Min ( ); coin.MaxVal = klines.Result.Data.Select ( k => k.High ).Max ( ); } }

Lo que me confunde es cómo puedo lograr esto porque necesito poder calcular los valores mínimo y máximo. Entonces, si accedo a Result, la función se ejecuta de inmediato, ¿verdad?

Así que no puedo entender cómo lograr este cálculo en paralelo.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Simplemente cree una operación asíncrona anidada para obtener el mínimo/máximo para una sola Coin , luego ejecute todo en paralelo:

 public static async Task GetMinMaxValues ( BinanceClient client, ObservableCollection<Coin> coins ) { await Task.WhenAll(coins.Select(async c=>await GetMinMax(c, client)).ToList()); } public static async Task GetMinMax(Coin coin, BinanceClient client) { var res = await client.Spot.Market.GetKlinesAsync ( coin.SymbolPair ); coin.MinVal = klines.Result.Data.Select ( k => k.Low ).Min ( ); coin.MaxVal = klines.Result.Data.Select ( k => k.High ).Max ( ); }

El peligro de tal enfoque puede ser que, en caso de que tenga muchas Coins , creará una gran cantidad de tareas en un solo momento. Si este es el caso, también puede realizar algún tipo de partición del trabajo en los fragmentos del tamaño apropiado.

over 4 years ago · Santiago Trujillo Denunciar

0

No necesita hacerlo en paralelo para no bloquear la interfaz de usuario. Solo await la llamada al método asíncrono. No está claro exactamente qué devuelve GetKlinesAsync , pero algo como esto funcionaría sin bloquear la interfaz de usuario (asumiendo que el método está vinculado a IO y asumiendo que sus cálculos son razonablemente rápidos):

 public static async Task GetMinMaxValues(BinanceClient client, ObservableCollection<Coin> coins) { foreach (var coin in coins) { //Invokes asynchronous get method, waits for it to finish, and gets the result var result = await client.Spot.Market.GetKlinesAsync(coin.SymbolPair, KlineInterval.OneDay); //Use the result to set your coin values coin.MinVal = result.Data.Select(k => k.Low).Min(); coin.MaxVal = result.Data.Select(k => k.High).Max(); } }

Si quisiera ejecutar las llamadas en paralelo para acelerar la ejecución, podría, pero esto no es necesario para evitar que la llamada al método bloquee el subproceso de llamada.

Considere leer la documentación de Microsoft sobre la programación asincrónica basada en tareas . Hay muchas trampas por delante si no comprende realmente cómo funcionan Tasks , async y await en un nivel básico.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda