Czemu ma służyć konwencja "Async" dla metod, które zwracają Task
.? Przecież widzę, że jest to operacja asynchroniczna, słowo await mnie o tym informuje.
var test = await service.GetItemAsync();
Czemu ma służyć konwencja "Async" dla metod, które zwracają Task
.? Przecież widzę, że jest to operacja asynchroniczna, słowo await mnie o tym informuje.
var test = await service.GetItemAsync();
Tylko nie zawsze się zwraca Task i nie zawsze używa await w metodach, które są asynchroniczne.
IMO mogli pomyśleć nad jakimś oznaczeniem w IDE dla metod, które mają słowo kluczowe async
i chyba by wystarczyło.
Często jest tak, że w klasie chcesz mieć zarówno metodę synchroniczną jak i asynchroniczną. Bez postfixu async
nie mógłbyś ich mieć jednocześnie z tą samą nazwą.
No tak, ale pomimo tego nie mogę znaleźć sensu w używaniu tego suffixu dla metod, które zwracają Task<AnyObject>
(nie dla void).
Jeśli nie używamy await to i tak moim zdaniem forma:
var test = service.GetItem().Resullt;
Jest wystarczająco czytelna.
Możesz mieć dwie metody o tej samej nazwie (które coś zwracają):
async Task<object> Test();
object Test();
Ta konwencja pochodzi przede wszystkim z czasów kiedy w języku jeszcze nie było wsparcia dla asynchroniczności (async await), i tak już zostało, nie chcesz nie używaj, ja nie używam ;)
Gworys napisał(a):
Możesz mieć dwie metody o tej samej nazwie (które coś zwracają):
async Task<object> Test(); object Test();
Być może coś mi umknęło, bo nigdy nie widziałem czegoś takiego. Na czym to kompilujesz? W projekcie w VS2017 z wybranym .net'em 4.6.1 nie jestem w stanie skompilować takiego kodu:
public class TestClass
{
public object Test()
{
return null;
}
public async Task<object> Test()
{
return await Task.FromResult<object>(null);
}
}
Pięknie dostaję błąd pod tytułem Type 'TestClass' already defines a member called 'Test' with the same parameter types tak jak oczekiwałem.
Przeciążanie metod polega na przeciążaniu parametrów, a nie typów zwracanych.
Ja kiedyś zrobiłem śmieszny błąd. Metoda nie miała async w nazwie i zwracała generycznego taska od klasy która miała właściwość Id
. Nie zrobiłem na tej metodzie await
, a potrzebowałem tylko wartość Id
zwracanego obiektu.Trochę czasu minęło aż doszedłem co nie działa. Problem był w tym że Task
sam w sobie też posiada właściwość Id
i pobierałem ją ponieważ nie robiłem await
na tym tasku. Jakie było moje zdziwienie jak w bazie zapisywałem Id
Taska zamiast obiektu xD.