visual studio microsoft español descargar community c# asynchronous callback task-parallel-library

c# - microsoft - visual studio installer



Dónde definir la devolución de llamada para el método asincrónico basado en tareas (1)

La forma generalmente aceptada es 3.

Los usuarios de TPL generalmente saben que pueden continuar una tarea con ContinueWith. 1 y 2 proporcionan la misma funcionalidad, pero con una interfaz no estándar; el usuario tiene que averiguar qué significa el parámetro de delegado y qué pasar, por ejemplo, si no quiere continuar, todo mientras el método todavía devuelve una Tarea que puede continuarse de la manera estándar.

Después de esta pregunta , intento implementar un método asíncrono utilizando el TPL y tratando de seguir las pautas de TAP.

Quiero que mi método asíncrono realice una devolución de llamada cuando haya terminado. Por lo que puedo ver, hay tres formas en que puedo hacer esto.

1) Devolución de llamada manualmente en mi delegado de tareas

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work //call callback manually completedCallback(); }); }

2) Asignar devolución de llamada a la tarea en el delegado de la tarea

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work } ).ContinueWith(completedCallback); //assign callback to Task }

3) Asignar devolución de llamada a la tarea en la persona que llama

public Task DoWorkAsync() { return Task.Factory.StartNew( { //do work }); } public void SomeClientCode() { Task doingWork = DoWorkAsync(); doingWork.ContinueWith(OnWorkCompleted); }

Mi intuición es que 3 es más correcto, porque desacopla la devolución de llamada del método, y significa que el código del cliente puede gestionar la tarea de la forma que considere adecuada (mediante devoluciones de llamada, sondeos, etc.), que parece ser de lo que se tratan las tareas. . Sin embargo, ¿qué sucede si DoWorkAsync () completa su trabajo antes de que el código del cliente conecte su devolución de llamada?

¿Hay una manera generalmente aceptada de hacer esto o es demasiado nuevo?

¿Hay alguna ventaja de hacer 2) más de 1)?