Podana zwracany typ metody jest Task<string>
. Próbujesz zwrócić wartość string
. Nie są one takie same, ani nie ma niejawnej konwersji z ciągu znaków na Task<string>
, stąd błąd.
Najprawdopodobniej myli to z async
sposobu, w którym wartość zwracana jest automatycznie zawinięte w Task
przez kompilator. Obecnie ta metoda nie jest metodą asynchroniczną. Prawie na pewno chcesz to zrobić:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
Istnieją dwie kluczowe zmiany. Po pierwsze, metoda jest oznaczana jako async
, co oznacza, że typ zwracany jest zawijany w Task
, co powoduje kompilację metody. Następnie nie chcemy czekać na blokowanie. Zasadą jest, że podczas korzystania z modelu await
należy zawsze unikać blokowania, gdy tylko jest to możliwe. Task.Delay
to zadanie, które zostanie ukończone po określonej liczbie milisekund. Przez await
- w tym zadaniu skutecznie wykonujemy nieblokujące oczekiwanie na ten czas (w rzeczywistości pozostała część metody jest kontynuacją tego zadania).
Jeśli wolisz 4.0 sposób to zrobić bez użycia await
, można to zrobić:
private Task<string> methodAsync()
{
return Task.Delay(10000)
.ContinueWith(t => "Hello");
}
Pierwsza wersja zostanie skompilowany w dół do czegoś, co jest mniej więcej tak, ale będzie to miało niektóre dodatkowe kody w obsłudze wspomagającej obsługę błędów i inne funkcje await
nie wykorzystujemy tutaj.
Jeśli Twój Thread.Sleep(10000)
ma naprawdę być tylko zastępczym dla niektórych długo uruchomiony metody, a nie tylko sposobem czekając na chwilę, a następnie będziesz musiał upewnić się, że praca jest wykonywana w innym wątku, zamiast obecnego kontekstu. Najprostszym sposobem na osiągnięcie tego jest poprzez Task.Run
:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
SomeLongRunningMethod();
return "Hello";
});
}
Albo raczej:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}
jak mogę jednoznacznie owinąć 'string' w' Task'?LUB nie ma żadnego sposobu zwrócenia 'Task' lub' Task 'bez używania' async' i 'await' w wywołanej metodzie (w tym przypadku methodAsync)? –
dotNETbeginner
@dotNETbeginner no –
@Aniket Nie, mylisz się, istnieje wiele sposobów na jawne zawijanie łańcucha znaków w zadaniu. Będę edytować rozwiązanie w. – Servy