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
StartNew
menos 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
async
palabra clave:Si su método asíncrono está haciendo trabajo en la CPU, debe usar
Task.Run
:Puede encontrar mi
async
/await
introducción útil.fuente
TaskFactory.FromAsync
para 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.Delay
retornos?await
es una "espera asincrónica", por lo que no pasa a la siguiente iteración hasta que la tarea devuelta seTask.Delay
complete.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ónTask
no se completará inmediatamente después de la creación.