valida una tuvo traves thread subprocesos subproceso sirve que para operacion net llamó interfaz form false diferente control checkforillegalcrossthreadcalls aplicación aplanó acceso c# asynchronous asp.net-web-api async-await c#-5.0

c# - una - ¿Cómo se implementa un método delegado de acción asíncrona?



thread invoke c# (2)

Un poco de información de fondo.

Estoy aprendiendo la pila API web y estoy tratando de encapsular todos los datos en forma de un objeto "Resultado" con parámetros como Success y ErrorCodes.

Sin embargo, diferentes métodos producirían diferentes resultados y códigos de error, pero el objeto resultante generalmente se instanciaría de la misma manera.

Para ahorrar algo de tiempo y también para aprender más acerca de las capacidades async / await en C #, estoy tratando de ajustar todos los cuerpos de métodos de mis acciones de API web en un delegado de acción asíncrono, pero quedé atrapado en un pequeño inconveniente ...

Dadas las siguientes clases:

public class Result { public bool Success { get; set; } public List<int> ErrorCodes{ get; set; } } public async Task<Result> GetResultAsync() { return await DoSomethingAsync<Result>(result => { // Do something here result.Success = true; if (SomethingIsTrue) { result.ErrorCodes.Add(404); result.Success = false; } } }

Quiero escribir un método que realice una acción en un objeto Result y lo devuelva. Normalmente a través de métodos síncronos sería

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new() { T result = new T(); resultBody(result); return result; }

¿Pero cómo transformo este método en un método asincrónico usando async / await?

Esto es lo que he intentado:

public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) where T: Result, new() { // But I don''t know what do do from here. // What do I await? }


El equivalente async de Action<T> es Func<T, Task> , así que creo que esto es lo que estás buscando:

public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody) where T : Result, new() { T result = new T(); await resultBody(result); return result; }


Entonces, creo que la forma de implementar esto es:

public Task<T> DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new() { return Task<T>.Factory.StartNew(() => { T result = new T(); resultBody(result); return result; }); }