Ich versuche, Func mit der Async-Methode zu verwenden. Und ich bekomme einen Fehler.
Asynchroner Lambda-Ausdruck kann nicht in Delegatentyp konvertiert werden
'Func<HttpResponseMesage>'
. Ein asynchroner Lambda-Ausdruck kann void, Task oder zurückgebenTask<T>
, von denen keiner konvertierbar ist'Func<HttpResponseMesage>'
.
Unten ist mein Code:
public async Task<HttpResponseMessage> CallAsyncMethod()
{
Console.WriteLine("Calling Youtube");
HttpClient client = new HttpClient();
var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM");
Console.WriteLine("Got Response from youtube");
return response;
}
static void Main(string[] args)
{
Program p = new Program();
Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
Func<HttpResponseMessage> myFun =async () => await myTask;
Console.ReadLine();
}
c#
asynchronous
lambda
maxspan
quelle
quelle
Antworten:
Da der Fehler sagt, Asynchron - Methoden geben
Task
,Task<T>
odervoid
. Damit dies funktioniert, können Sie:Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
quelle
Console.ReadLine()
ist. Die App könnte beenden , bevor die Asynchron - Operation ist abgeschlossen, wenn Sie nicht ausdrücklichWait
auf demTask
.Der Weg , den ich in der Regel nehmen ist , die haben
Main
Methode invoke einRun()
Verfahren , dass die Rendite einer Aufgabe, und.Wait()
auf dasTask
zu vervollständigen.class Program { public static async Task<HttpResponseMessage> CallAsyncMethod() { Console.WriteLine("Calling Youtube"); HttpClient client = new HttpClient(); var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); Console.WriteLine("Got Response from youtube"); return response; } private static async Task Run() { HttpResponseMessage response = await CallAsyncMethod(); Console.ReadLine(); } static void Main(string[] args) { Run().Wait(); } }
Auf diese Weise kann der Rest Ihrer Konsolen-App mit vollständiger Unterstützung für asynchrones Warten / Warten ausgeführt werden. Da eine Konsolen-App keinen UI-Thread enthält, besteht bei der Verwendung von kein Risiko eines Deadlocks
.Wait()
.quelle
Main
Methode jedoch eine asynchrone Aufgabe zurückgeben, damit Sie in einer Konsolen-App warten können.Code-Korrektur wie:
static void Main(string[] args) { Program p = new Program(); Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); Func<Task<HttpResponseMessage>> myFun = async () => await myTask; Console.ReadLine(); }
quelle
Führen Sie im Func die Aufgabe aus, warten Sie darauf, prüfen Sie sie auf Ausnahmen, und geben Sie dann das Ergebnis zurück.
Func<HttpResponseMessage> myFun = () => { var t = Task.Run(async () => await myTask); t.Wait(); if (t.IsFaulted) throw t.Exception; return t.Result; };
quelle