2016-12-14 2 views
2

Ich muss ein Argument vom Typ Task an eine Funktion übergeben, die hier nicht dargestellt wird. Innerhalb der Funktion wird diese Aufgabe asynchron ausgeführt. Wenn es einen Unterschied zwischen diesen drei Möglichkeiten, passieren sie:Task.Run vs Invoke() Unterschied

1.

Task.Run((Func<Task>)(async() => Foo = await OperateAsync(id))) 

2.

Task.Run(async() => Foo = await OperateAsync(id)) 

3.

((Func<Task>)(async() => Foo = await OperateAsync(id))).Invoke() 

Antwort

3

Ja.

1 und 2 unterscheiden sich in welcher Überlastung von Task.Run wird aufgerufen. Letzteres geht durch das Ergebnis.

1 und 2 force OperateAsync an den Thread Pool, 3 nicht, die sehr gut sichtbar sein kann, abhängig von anderen Details. Zum Beispiel in Desktop-Anwendungen, wenn OperateAsync endet Zugriff auf UI-Elemente, darf nicht mit Task.Run aufgerufen werden.

+0

Ist der zweite Ansatz in Bezug auf die Leistung besser als der erste? – AsValeO

+1

@AsValeO Es sollte das gleiche sein. Wenn beides messbar schneller ist, denke ich, das ist eine verpasste Chance für den anderen. Wenn Sie wegen der Delegiertenkonstruktion fragen, sollten Sie bedenken, dass dies auch im zweiten Fall implizit geschieht. – hvd

Verwandte Themen