Verwenden Sie auf die nicht -cPU -intensive Aufgabe auf die nicht aufmerksame Aufgabe
-
22-10-2019 - |
Frage
Ich habe so etwas:
private void DoSomething()
{
System.Console.WriteLine("Creating Foo");
Foo result = new Foo();
DoSomethingAsync();
System.Console.WriteLine("Returning Foo");
return result;
}
private async void DoSomethingAsync()
{
// The following task takes a long time, but is not CPU intensive
await TaskEx.Run(() =>
{
// code lives here... removed for this example
});
}
Da ich nicht viel auf die CPU drücke, brauche ich keinen Thread. Was kann ich verwenden, anstatt zu rennen, um die Erstellung eines Threads zu vermeiden?
Lösung
Ich denke, Sie verstehen die Absicht der Aufgabe Asynchrony -Muster hier. Was Sie tun, ist wahrscheinlich besser behandelt von ThreadPool.QueueUserWorkItem
Dies wird einen Arbeiter -Thread aus dem Pool des Prozesses wiederverwenden und nur einen bei Bedarf erstellen.
Mit dem TAP können Sie eine Aufgabe in "Brocken" der Arbeit unterbrechen, die schrittweise verarbeitet werden können, aber sie bietet jedoch keine Möglichkeit, "dies ist eine Hintergrundaufgabe" zu sagen.
Andere Tipps
Es hängt von der Aufgabe ab, die Sie ausführen. Da Sie sagen, dass es nicht viel CPU verwendet, gehe ich davon aus, dass die Aufgabe lange dauert, da sie auf andere Ereignisse wartet. Sie müssen also Ihre Aufgabe entwerfen, um Rückrufe für diese Ereignisse zu registrieren, bei denen jeder Rückruf schnell im Haupt -Thread abgeschlossen ist, jedoch erst ausgelöst wird, wenn das Ereignis, auf das Sie warten, tatsächlich auftritt.