我尝试的以下代码的每个变体都不起作用 - 无论是DoSomething() : void
和被称为书面,还是DoSomething() : Task
被调用TaskEx.RunEx()
,一些尝试涉及.GetAwaiter().GetResult()
. 看到的错误包括:"Start may not be called on a task with null action"
、"RunSynchronously may not be called on a task unbound to a delegate"
和"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();
});
}
}
输出:
开始做某事...
按任意键退出。
PrepareAwaitable
'sTask
后面Action
会更复杂。当此操作完成时,无论花费多长时间,我都希望Task
(或其他框架机制)通过分配给 x 来恢复"Howdy ..."
,然后再分配给 y。我真正想做的是拦截等待的对象,处理它们,并在稍后我控制的某个时间,以结果(x
和y
)继续继续。但我在这大步上还没有走得太远,所以我试图从小处着手。