visual valid net example documentacion comment comentarios code c# asynchronous task-parallel-library c#-5.0

c# - valid - La mejor forma de convertir el método asincrónico basado en la devolución de llamada a una tarea agitada



comments code c# (2)

¿Cuál sería la mejor forma de convertir / ajustar un método asincrónico "clásico" que utiliza una devolución de llamada a algo que devuelve una Tarea (agitable)?

Por ejemplo, dado el siguiente método:

public void GetStringFromUrl(string url, Action<string> onCompleted);

La única manera que conozco de incluir esto en un método para devolver una tarea es:

public Task<string> GetStringFromUrl(string url) { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; }

¿Es esta la única manera de lograr esto?

¿Y hay una forma de ajustar la llamada a GetStringFromUrl (url, callback) en la tarea misma (es decir, la llamada se ejecutará dentro de la tarea en lugar de sincrónicamente)


Su código es corto, legible y eficiente, así que no entiendo por qué está buscando alternativas, pero no se me ocurre nada. Creo que su enfoque es razonable.

Tampoco estoy seguro de por qué crees que la parte síncrona está bien en la versión original, pero quieres evitarla en la basada en Task . Si crees que la parte síncrona puede tardar demasiado, corrígela para las dos versiones del método.

Pero si desea ejecutarlo de forma asincrónica (es decir, en ThreadPool ) solo en la versión de Task , puede usar Task.Run() :

public Task<string> GetStringFromUrl(string url) { return Task.Run(() => { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; }); }


Su implementación supuesta está perfectamente bien para esto suponiendo que la devolución de llamada solo maneja situaciones exitosas. ¿Qué ocurre actualmente si ocurre una excepción dentro de las bases asincrónicas de la implementación GetStringFromUrl? No hay una manera real para que ellos lo propaguen a la devolución de llamada de Acción ... ¿simplemente lo tragan y le devuelven nulo o algo así?

Lo único que recomendaría es seguir la nueva convención de nombrar tales métodos de sincronización con el sufijo XXXAsync.