Cada variación sobre el siguiente código que intento no funciona - si DoSomething() : void
y se llama como está escrito, o DoSomething() : Task
y se llama con TaskEx.RunEx()
, algún intento que implica .GetAwaiter().GetResult()
. Los errores vistos incluyen: "Start may not be called on a task with null action"
, "RunSynchronously may not be called on a task unbound to a delegate"
y "The task has not yet completed"
.Llamar a un método asíncrono de un método no asíncrono
class Program
{
static void Main(string[] args) // Starting from a non-async method
{
DoSomething();
Console.WriteLine("Press any key to quit.");
Console.ReadKey();
}
static async void DoSomething()
{
Console.WriteLine("Starting DoSomething ...");
var x = await PrepareAwaitable(1);
Console.WriteLine("::" + x);
var y = await PrepareAwaitable(2);
Console.WriteLine("::" + y);
}
static Task<string> PrepareAwaitable(int id)
{
return new Task<string>(() =>
{
return "Howdy " + id.ToString();
});
}
}
Salida:
partir HacerAlgo ...
Presione cualquier tecla para salir.
PrepareAwaitable
s Action
's Task
' será más complicado después. Cuando se complete esta acción, sin importar el tiempo que tarde, esperaría que se reanude el Task
(u otros mecanismos del Marco) asignando "Howdy ..."
a x, y luego a y. Lo que REALMENTE quiero hacer es interceptar los objetos esperados, procesarlos, y en algún momento posterior que controlo, reanudo la continuación con un resultado (x
y y
). Pero no he ido muy lejos en ese gran paso, así que estoy tratando de comenzar más pequeño.
¿Qué estás * intentando * hacer? Es difícil saber qué significa "no funciona" cuando no sabemos cómo sería el "trabajo". –
Quiero que se ejecute hasta su finalización, por favor. Tal vez me pareció obvio lo que debería estar haciendo debido a cuán equivocado está mi entendimiento. –
@uosef: ¿Pero correr? No hay nada realmente asincrónico aquí? –