Soy desarrollador js y salté a C#. Estoy aprendiendo async/await/Task en C# y no puedo entender cómo controlar C# Task.
En javascript, puedo guardar el controlador de resolve de Promise para llamarlo más tarde (y resolver la promesa), por ejemplo, para organizar la comunicación entre algunas partes de la aplicación "mal conectadas" (la solicitud no devuelve el resultado, pero el resultado se envía por separado y activa algún "replyEvent "), y hacer algo como esto:
// javascript const handlers = {} // event firing on reply const replyEventListener = (requestId, result) => { if (handlers[requestId]) { handlers[requestId](result) delete handlers[requestId] } } const requestFunction = (id, params) => new Promise(resolve => { // handler is saved to use later from "outside" handlers[id] = resolve; // do required request makeRequest(params) }) // .. somewhere in code request becomes simple awaitable const resultOfRequest = await requestFunction(someUniqueId) ¿Cómo puedo hacer lo mismo con C# Task ?
Creo que la filosofía detrás de Promise (en JS) y Task (en C#) es diferente. No los implementamos exactamente de la misma manera.
Lea la documentación en MSDN:
Debes vaciar tu copa para poder volver a llenarla.
Un buen artículo en MSDN es el siguiente que muestra ejemplos de cómo las tareas se pueden usar como promesas en el sentido de que puede iniciarlas y luego esperarlas más tarde.
Programación asíncrona con async y await
Si desea await una Task en C# como lo haría con una Promise en JS, debe hacer lo siguiente:
Task . Por lo general, esta será una Task de algún objeto de clase. En el artículo anterior, hace referencia a la creación del desayuno como una analogía, por lo que puede definir FryEggsAsync como un método que toma un número int de cuántos huevos freír y devuelve Task<Egg> . La convención de C# es terminar cualquier función o nombre de método con Async para indicar que se devuelve una Task .Task , que es similar a Promise en JS, por lo que podría hacer var eggsTask = FryEggsAsync(2) , que almacenaría una Task<Egg> en eggsTask , que luego puede esperar o pasar a otras funciones según sea necesario.Task lo resuelva y obtenga el resultado, simplemente await eggsTask . También puede usar Task.WaitAll para await varias tareas a la vez, similar a Promise.all en JS, al pasar una matriz de tareas como argumento para esa llamada de método. Consulte la documentación de Task.WaitAll para ver algunos ejemplos de esto. Sin embargo, la diferencia aquí es que los resultados se almacenan por separado en cada tarea que se pasa a Task.WaitAll , en lugar de agregarse en una matriz de resultados como en JS con Promise.all , pero si necesita await varias tareas, será más fácil forma de hacerlo.