2012-10-22 4 views
6

Ero entusiasta di creare la mia prima app con C# 5.0, e volevo usare le parole chiave asincrone/attese per alleviare il dolore delle chiamate dati asincrone.La mancanza della parola chiave async nelle interfacce interrompe il DI in C# 5.0?

Sono un po 'sconcertato che le interfacce non consentano che la parola chiave async faccia parte del contratto, poiché la parola chiave await funziona solo per i metodi con segno asincrono. Ciò significherebbe che è impossibile chiamare i metodi asincroni attraverso i riferimenti all'interfaccia. Questo vale anche per i metodi astratti. Mi sto perdendo qualcosa qui? Ciò significherebbe che il mio normale DI-roba non funzionerà più:

IAsyncRepository<T> { 
Task<IList<T>> GetAsync(); // no 'async' allowed 
} 

abstract class AsyncRepositoryBase<T> { 
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed 

// codice client:

IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>(); 
var items = await repo.GetAsync(); // DOOOOOH, will not compile! 

Questa è la mia soluzione attuale:

public abstract class AsyncRepositoryBase<T> 
{ 
    protected Task<IList<T>> _fetcherTask; 

    protected AsyncRepositoryBase(Task<IList<T>> fetcherTask) 
    { 
     _fetcherTask = fetcherTask; 
    } 

    public virtual async Task<IList<T>> GetASync() 
    { 
     return await _fetcherTask; 
    } 
} 

Ci sono diritti da scegliere tra l'astrazione e la funzionalità langauge? Per favore dimmi che mi manca qualcosa.

+0

Qualsiasi astrazione perde in un modo o nell'altro. Ma non è un problema, devi solo fornire un modo per implementare il modello asincrono. Restituire IAsyncResult è sufficiente. –

risposta

7

await keyword only works for async marked methods

C'è il tuo problema. Mentre await deve essere all'interno di un metodo async, può attendere su qualsiasi attività, sia implementato tramite async oppure no.

Ad esempio:

interface IFoo { 
    Task BarAsync(); 
} 

class Foo : IFoo { 
    public async Task BarAsync() { 
     // Implemented via async/await in this case. 
     // You could also have implemented it without async/await. 
    } 
} 

// ... 

async void Test() { 
    IFoo foo = ... ; 
    await foo.BarAsync(); // Works no matter how BarAsync is implemented. 
} 

quanto riguarda il tuo errore di sintassi: await repo.GetAsync(); // DOOOOOH, will not compile! - Hai dimenticato di contrassegnare il metodo che contiene questo pezzo di codice come async (non si devono marcare le IAsyncRepository.GetAsync come async)?

+0

Grazie, questo è quello che ho avuto, ma ho ricevuto errori del compilatore. Riscritelo e non ho errori ora. Non so se fosse il mio o il compilatore, darò la colpa al compilatore e andrò a letto. Grazie :) – tuxbear

Problemi correlati