2012-11-23 19 views
8

Se ho un'interfaccia quali:asincrone funzioni programmic e virtuali

using System.Threading.Tasks; 

... 

public interface IFoo 
{ 
    Task doIt(); 

    Task<bool> doItAndReturnStuff(); 
} 

e una delle classi che implementano questa interfaccia solo capita di non richiedere metodi asincrone, come posso correggere ignorare queste funzioni?

In altre parole, come si restituiscono correttamente "void" e "bool" racchiusi negli oggetti Task?

Ad esempio:

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; 
    } 
} 

NOTA - Non riesco a striscia la roba Task completamente perché alcune delle classi che implementano questa interfaccia sono infatti asincrono.

Grazie

+0

'ritorno Task.Run (() => true);' –

+1

@ LB: Questo crea un lavoro extra senza una vera ragione, ed è meno prevedibile che restituire un'attività che è già stata completata. –

risposta

15

non è chiaro che cosa si sta cercando di raggiungere, ma un approccio (che apparirebbe più come il codice "normale") è probabilmente solo per farli metodi asincroni in ogni caso:

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

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

Senza alcuna espressione await, il metodo verrà completato in modo sincrono. Avrai un avvertimento su ciascun metodo, ma potresti disabilitarlo solo per questo pezzo di codice usando uno #pragma.

In alternativa - e credo che più semplicemente in termini di non richiedere una #pragma per disabilitare gli avvisi - sarebbe quella di utilizzare 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

Il tuo primo snippet di codice sopra - "probabilmente solo per renderli comunque metodi asincroni" - non verrà compilato. Ecco perché sto facendo questa domanda. Otterrai "errore CS0161: non tutti i percorsi di codice restituiscono un valore". Immagino sia per questo che hai avuto un piccolo commento laggiù :) TUTTAVIA, il secondo frammento, in particolare l'implementazione DoIt(), è esattamente il tipo di hack che stavo cercando. Grazie molto! – swinefeaster

+1

@swinefeaster: la prima versione dovrebbe davvero essere compilata, se hai incluso il modificatore asincrono. Sei sicuro di averlo fatto? Verificherò quando tornerò al computer. –

+1

@swinefeaster: L'ho appena provato, e va bene - anche se ho dovuto rimuovere il 'override' mentre implementava un'interfaccia, non sovrascrivendo un metodo di classe base. Ricevo solo CS0161 senza il modificatore 'async'. –

Problemi correlati