Cada publicación de blog que he leído te dice cómo consumir un método asincrónico en C #, pero por alguna extraña razón nunca explicas cómo construir tus propios métodos asincrónicos para consumir. Entonces tengo este código en este momento que consume mi método:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
Y escribí este método que es CountToAsync:
private Task<DateTime> CountToAsync(int num = 1000)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < num; i++)
{
Console.WriteLine("#{0}", i);
}
}).ContinueWith(x => DateTime.Now);
}
¿Es esta, el uso de Task.Factory, la mejor manera de escribir un método asincrónico, o debería escribir esto de otra manera?
c#
async-await
c#-5.0
Khalid Abuhakmeh
fuente
fuente

Respuestas:
No lo recomiendo a
StartNewmenos que necesite ese nivel de complejidad.Si su método asincrónico depende de otros métodos asincrónicos, el enfoque más sencillo es usar la
asyncpalabra clave:Si su método asíncrono está haciendo trabajo en la CPU, debe usar
Task.Run:Puede encontrar mi
async/awaitintroducción útil.fuente
TaskFactory.FromAsyncpara envolverBeginInvoke. No estoy seguro de lo que quiere decir sobre "código de devolución de llamada"; no dude en publicar su propia pregunta con código.Task.Delayretornos?awaites una "espera asincrónica", por lo que no pasa a la siguiente iteración hasta que la tarea devuelta seTask.Delaycomplete.Si no desea usar async / await dentro de su método, pero aún así "decorarlo" para poder usar la palabra clave wait desde afuera, TaskCompletionSource.cs :
De aquí y de aquí
Vi que también se usa en la fuente .NET, por ejemplo. WebClient.cs :
Finalmente, encontré útil también lo siguiente:
Introducción a Async / Await en ASP.NET
Si el objetivo es mejorar la escalabilidad (en lugar de la capacidad de respuesta), todo depende de la existencia de una E / S externa que brinde la oportunidad de hacerlo.
fuente
Una forma muy simple de hacer que un método sea asincrónico es usar el método Task.Yield (). Como dice MSDN:
Insértelo al comienzo de su método y luego regresará inmediatamente a la persona que llama y completará el resto del método en otro hilo.
fuente
Task.Yield()hecho, es útil, para los casos en que desea asegurarse de que la devoluciónTaskno se completará inmediatamente después de la creación.