2012-10-22 7 views
6

Byłem podekscytowany, aby utworzyć moją pierwszą aplikację z C# 5.0, i chciałem użyć słów kluczowych async/czekaj, aby złagodzić bóle asynchronicznych połączeń danych.Czy brak asynchronicznego słowa kluczowego w interfejsach powoduje przerwanie DI w C# 5.0?

Jestem nieco zakłopotany, że interfejsy nie pozwalają na asynchroniczne słowo kluczowe, które jest częścią umowy, ponieważ słowo kluczowe oczekuje tylko na asynchroniczne metody zaznaczone. Oznaczałoby to, że niemożliwe jest wywoływanie metod asynchronicznych za pomocą odwołań do interfejsu. Dotyczy to również metod abstrakcyjnych. Czy coś mi umyka? Oznaczałoby to, że mój regularny DI-rzeczy nie będą już działać:

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

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

// kod klienta:

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

To jest mój obecny rozwiązanie:

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

Czy muszę wybrać między abstrakcją a funkcją langauge? Proszę powiedz mi, że czegoś mi brakuje.

+0

Wszelkie abstrakcje są nieszczelne w taki czy inny sposób. Ale to nie jest problem, wystarczy podać sposób implementacji wzorca asynchronicznego. Zwracanie funkcji IAsyncResult jest wystarczające. –

Odpowiedz

7

await keyword only works for async marked methods

Twój problem. Podczas gdy await musi być w metodzie i async, może oczekiwać na każde zadanie, czy to zaimplementowane przez async czy nie.

Na przykład:

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

Jak za błąd składni: await repo.GetAsync(); // DOOOOOH, will not compile! - zapomniałeś oznaczyć metodę zawierający ten fragment kodu jako async (nie trzeba zaznaczyć IAsyncRepository.GetAsync jako async)?

+0

Dzięki, to jest to, co miałem, ale mam na nim błędy kompilatora. Przepisz to, a teraz nie otrzymuję żadnych błędów. Dunno, jeśli to był mój lub kompilator, obwiniam kompilator i kładę się spać. Dzięki :) – tuxbear

Powiązane problemy