2012-11-23 23 views
8

Jeśli mam interfejsu takich jak:asynchroniczne programmic i wirtualne funkcje

using System.Threading.Tasks; 

... 

public interface IFoo 
{ 
    Task doIt(); 

    Task<bool> doItAndReturnStuff(); 
} 

i jednej z klas realizujących ten interfejs Tak się nie wymagać metod async, jak mogę poprawić zastąpić te funkcje?

Innymi słowy, w jaki sposób poprawnie zwracam "void" i "bool" zawinięte w obiekty zadań?

Na przykład:

public class FooHappensToNotNeedAsync : IFoo 
{ 
    public override Task doIt() 
    { 
    // If I don't return anything here, I get 
    // error that not all code paths return a value. 
    // Can I just return null? 
    } 

    public override Task<bool> doItAndReturnStuff() 
    { 
    // If I want to return true, how to I do it? 
    // This doesn't work: 
    return true; 
    } 
} 

UWAGA - Nie mogę rozebrać rzeczy zadań całkowicie, ponieważ niektóre z tych klas, które implementują ten interfejs w rzeczywistości Asynch.

Dzięki

+0

'powrotu Task.Run (() => prawdziwy)' –

+1

@ LB: To tworzy dodatkową pracę bez prawdziwego powodu i jest mniej przewidywalne niż zwrot zadania, które zostało już zakończone. –

Odpowiedz

15

nie jest jasne, co starasz się osiągnąć, ale jedno podejście (które wyglądają najbardziej jak „normalny” Code) jest prawdopodobnie tylko do nich metody async i tak:

public async Task DoIt() 
{ 
    // No-op 
} 

public async Task<bool> DoItAndReturnStuff() 
{ 
    return true; 
} 

Bez żadnych wyrażeń , metoda zakończy się synchronicznie mimo to. Otrzymasz ostrzeżenie o każdej metodzie, ale możesz wyłączyć to tylko dla tego fragmentu kodu, używając #pragma.

Alternatywnie - i chyba prostszy pod względem nie wymaga #pragma wyłączyć ostrzeżenia - byłoby użyć Task.FromResult:

public Task DoIt() 
{ 
    // Returns a Task<bool>, but that's okay - it's still a Task 
    return Task.FromResult(true); 
} 

public Task<bool> DoItAndReturnStuff() 
{ 
    return Task.FromResult(true); 
} 
+0

Twój pierwszy fragment kodu powyżej - "prawdopodobnie tylko po to, aby uczynić je asynchronicznymi metodami" - nie będzie się kompilował. Właśnie dlatego zadaję to pytanie. Otrzymasz "error CS0161: nie wszystkie ścieżki kodu zwracają wartość". Sądzę, że właśnie dlatego miałeś w tym miejscu mały dziwny komentarz :). JEDNAK, twój drugi fragment, a zwłaszcza implementacja DoIt(), jest dokładnie takim hackem, jakiego szukałem. Wielkie dzięki! – swinefeaster

+1

@ swinefeaster: Pierwsza wersja naprawdę powinna się skompilować, jeśli dodałeś modyfikator asynchroniczny. Jesteś pewien, że to zrobiłeś? Sprawdzi podwójnie, gdy wrócę do komputera. –

+1

@ swinefeaster: Po prostu próbowałem i jest w porządku - chociaż musiałem usunąć "override", ponieważ implementuje interfejs, nie przesłoniwszy metody klasy bazowej. Dostaję tylko CS0161 bez modyfikatora 'async'. –