2012-08-28 12 views
12

Dire che ho un'interfacciaCome utilizzare asincrona su un metodo di interfaccia vuoto

interface IFoo { 
    Task SomeMethodAsync(); 
} 

e ho voluto implementare questa interfaccia, ma per una classe il metodo è vuoto.

Devo vivere con l'avviso che produce?

async Task SomeMethodAsync() {} 

Oppure devo restituire qualche compito fittizio?

async Task SomeMethodAsync() { await Task.Run(() => {}); } 

Oppure c'è un'altra opzione?

Inoltre, voglio implementare questo metodo come metodo di interfaccia esplicito. Questo farà qualche differenza?

+0

possibile duplicato di [Interfacce e metodi asincroni] (http://stackoverflow.com/questions/13573516/interfaces-and-async-methods) – abatishchev

risposta

14

I metodi che restituiscono Task non devono essere async.

lo consiglio qualcosa di simile:

Task IFoo.SomeMethodAsync() 
{ 
    return Task.FromResult(true); 
} 

Sto assumendo che se questo era un metodo sincrono, si sarebbe solo avere un corpo del metodo vuoto; questo è l'equivalente async di un corpo del metodo vuoto.

2

Dipende solo da come si decide che il framework deve gestire tali casi.

Hai, imo, diverse opzioni:

  • sollevare un'eccezione (si romperà diementicato esecuzione, e si deve manico in qualche modo, in qualche luogo nella catena di esecuzione).

  • ritorno default-value (che può essere una soluzione offerta da te:. Solo un compito vuoto che non fa nulla di male su questo è che io chiamo la funzione aspetta lo fa qualcosa, non mi notifica su nulla, ma non fare nulla neanche. Imo, questo è cattivo design.

  • ritorno alcuni not-valid-value, che intercettato da chiamante in modo chiamante "sa" che qualcosa non è ok.

0

Mi sono imbattuto in questo con una classe base astratta. Ho provato il metodo di Stephen Cleary, ma è stato sempre errori di compilazione in C# 6.

Un esempio del mio metodo di base:

protected abstract Task OnFoo(Bar bar); 

Questo è quello che dovevo fare nella mia classe derivata:

protected override async Task OnFoo(Bar bar) 
{ 
    await Task.FromResult(true); 
} 

Il problema con l'altra risposta era la parola chiave return nella frase. Poiché il valore restituito di Task è essenzialmente void, non è possibile restituire nulla. Inoltre, è richiesta la parola chiave await.

Problemi correlati