Każda wariacja na poniższym kodem, który staram nie działa - czy DoSomething() : void
i nazywa się jak napisane lub DoSomething() : Task
i nazywa się TaskEx.RunEx()
niektóre próba z udziałem .GetAwaiter().GetResult()
. Wyświetlane błędy: "Start may not be called on a task with null action"
, "RunSynchronously may not be called on a task unbound to a delegate"
i "The task has not yet completed"
.Wywołanie metody asynchronicznej z metody non-asynchronicznym
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();
});
}
}
wyjściowa:
Zaczynając doSomething ...
Naciśnij dowolny klawisz, aby zamknąć.
PrepareAwaitable
's Task
' s Action
będzie bardziej skomplikowane później. Kiedy ta czynność zostanie zakończona, jak długo potrwa, spodziewam się, że Task
(lub inne mechanizmy ramowe) zostaną wznowione, przypisując "Howdy ..."
do x, a następnie do y. NAPRAWDĘ chcę zrobić, to przechwycić oczekujące obiekty, przetworzyć je, a później, które kontroluję, wznowić z wynikiem (x
i y
). Ale nie byłem zbyt daleko na tym dużym kroku, więc staram się zacząć mniejszy.
Co ty * próbujesz * zrobić? Trudno powiedzieć, co "nie działa", kiedy nie wiemy, jak "działa". –
Chcę, aby przebiegał do końca, proszę. Być może wydawało mi się oczywiste, co powinienem robić z powodu tego, jak błędne jest moje zrozumienie. –
@uosef: Uruchom co? Nie ma tu nic naprawdę asynchronicznego? –