Für den laufenden Code asynchron (zB mit async/warten) brauche ich eine ordnungsgemäße Aufgabe. Natürlich gibt es im Framework mehrere vordefinierte Methoden, die die häufigsten Operationen abdecken, aber manchmal möchte ich meine eigenen schreiben. Ich bin neu in C#, also ist es gut möglich, dass ich es falsch mache, aber ich bin zumindest nicht ganz glücklich mit meiner derzeitigen Praxis. Siehe das folgende Beispiel für das, was ich tue:Wie schreibe ich eine benutzerdefinierte Aufgabe richtig zurückgeben Methode
public async Task<bool> doHeavyWork()
{
var b1 = await this.Foo();
//var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
var b2 = await Task.Run(()=>Bar());
return b1 & b2;
}
public Task<bool> Foo()
{
return Task.Factory.StartNew(() =>
{
//do a lot of work without awaiting
//any other Task
return false;
});
}
public bool Bar()
{
//do a lot of work without awaiting any other task
return false;
}
Im Allgemeinen ich schaffen und solche Methoden wie die Foo Beispiel verbrauchen, aber es gibt ein ‚Extra‘ Lambda die gesamte Verfahren Logik enthält, die nicht sieht sehr hübsch imho. Eine andere Option ist die Verwendung einer Methode wie dem Bar-Beispiel, aber ich denke, das ist noch schlimmer, weil es nicht klar ist, dass diese Methode async ausgeführt werden sollte (abgesehen von richtigen Methodennamen wie BarAsync) und die Task.Factory.StartNew muss mehrmals im Programm wiederholt werden. Ich weiß nicht, wie ich dem Compiler nur sagen soll, dass diese Methode eine Aufgabe zurückgibt, bitte verpacken Sie sie als Ganzes in eine Aufgabe, wenn sie aufgerufen wird, was ich tun möchte.
Endlich meine Frage: Was ist der beste Weg, eine solche Methode zu schreiben? Kann ich das "zusätzliche" Lambda loswerden (ohne natürlich eine zusätzliche benannte Methode hinzuzufügen)?
EDIT Wie Servy angegeben immer guter Grund ist eine synchrone Version des Verfahrens zu haben. Eine Async-Version sollte nur dann zur Verfügung gestellt werden, wenn dies absolut notwendig ist (Stephen Cleary's Link).
'' ohne eine zusätzliche benannte Methode natürlich hinzuzufügen ''warum das als eine Option ablehnen? Erstellen Sie 'public bool Bar' und' public Task BarAsync'. –
Servy
Ich wollte Overhead vermeiden. Wenn es sinnvoll ist, eine synchrone oder asynchrone Methode zu verwenden, ist das in Ordnung. Wenn nicht, würde es ein öffentliches BarAsync und eine private Bar geben (um es zu verstecken) und in diesem Fall sehe ich nicht viel Grund dafür. – marce