Все варианты следующего кода, которые я пробую, не работают - будь то 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();
});
}
}
Вывод:
Запуск DoSomething ...
Нажмите любуюключ к выходу.
PrepareAwaitable
Task
Action
будет сложнее позже.Когда это действие завершится, как бы долго это ни заняло, я ожидал, что Task
(или другие механизмы Framework) возобновятся, присвоив "Howdy ..."
x, а затем - y.То, что я ДЕЙСТВИТЕЛЬНО хочу сделать, это перехватить ожидаемые объекты, обработать их и через некоторое время, которое я контролирую, возобновить продолжение с результатом (x
и y
).Но я не очень далеко продвинулся на этом большом шаге, поэтому я пытаюсь начать с меньшего.