Every variation on the following code that I try doesn't work - whether DoSomething() : void
and is called as written, or DoSomething() : Task
and is called with TaskEx.RunEx()
, some attempt involving .GetAwaiter().GetResult()
. Errors seen include: "Start may not be called on a task with null action"
, "RunSynchronously may not be called on a task unbound to a delegate"
, and "The task has not yet completed"
.
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();
});
}
}
Output:
Starting DoSomething ...
Press any key to quit.
PrepareAwaitable
's Task
's Action
will be more complicated later. When this action completes, however long that takes, I would expect the Task
(or other Framework mechanisms) to resume by assigning "Howdy ..."
to x, and then later to y. What I REALLY want to do is intercept the awaited objects, process them, and at some later time that I control, resume to the continuation with a result (x
and y
). But I haven't been getting very far on that big step, so I'm trying to start smaller.