Ich bin nicht sicher, ob dies möglich ist, mich hier so aus:Passing eine Aufgabe als Parameter
Ich habe eine Abfolge von Aktion mehr
async Task MethodA(...)
{
// some code
// a call to specific Async IO bound method
// some code
}
gibt es auch MethodB()
, MethodC()
usw. ausführen , und alle haben genau denselben Code, mit Ausnahme des Aufrufs für bestimmte Async IO-gebundene Methode. Ich versuche einen Weg zu finden, einen Aufgabenzeiger an eine Methode zu übergeben, damit wir sie später in einer Method() ausführen können.
Was ich derzeit tue, ist dies:
private async Task Method(Func<Task<Entity>> func)
{
// some code
var a = await task.Run(func);
// some code
}
var task = async() => await CallToIOBoundTask(params);
Method(task);
Dieser Code jedoch jedes Mal einen neuen Thread zieht, die nicht für IO gebunden Aufgabe erforderlich ist, und sollte vermieden werden.
Gibt es also eine Möglichkeit, den Code so zu refactorisieren, dass kein ThreadPool-Thread verwendet wird? Ein Ziel ist es, einen Code wie folgt zu haben:
Es ist auch wichtig zu erwähnen, dass verschiedene IO-Aufrufe verschiedene Methodensignaturen haben. Außerdem kann eine Task nur in Method()
Körper ausgeführt werden, und nicht vorher.
Möchten Sie warten, bis die Anweisung in der Methode 'Method()' für die asynchrone Task beginnt? Wenn dies der Fall ist, ist Ihr Codebeispiel in der Frage falsch (Sie warten auf eine _existierende_ Aufgabe, anstatt eine Aufgabe zu erstellen), und die bereits bereitgestellte Antwort entspricht Ihren Wünschen. Wenn Sie jedoch nur eine Aufgabe abwarten möchten, die Sie vor dem Aufruf der 'Method()' -Methode gestartet haben, beachten Sie, dass Sie dies leicht tun können: Rufen Sie einfach z. Übergeben Sie den Rückgabewert eines Aufrufs an CallToIOBoundTask() als Argument für den Aufruf der Method() -Methode. –
@PeterDuniho Eine Antwort auf Ihre Frage befindet sich im letzten Satz der Frage - Aufgabe muss ihre Ausführung in method() starten. – Goran