2012-08-28 8 views
12

Digamos que tiene una interfazCómo utilizar asíncrono en un método de interfaz de vacío

interface IFoo { 
    Task SomeMethodAsync(); 
} 

y quería implementar esta interfaz, pero para una clase el método está en blanco.

¿Debo vivir con la advertencia que esto produce?

async Task SomeMethodAsync() {} 

¿O debería devolverle alguna tarea ficticia?

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

¿O hay otra opción?

También quiero implementar este método como un método de interfaz explícito. ¿Eso hará alguna diferencia?

+0

posible duplicado de [Interfaces y métodos asíncronos] (http://stackoverflow.com/questions/13573516/interfaces-and-async-methods) – abatishchev

Respuesta

14

Los métodos que devuelven Task no tienen que ser async.

recomendaría algo como esto:

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

estoy asumiendo que si se trataba de un método sincrónico, sólo tendría un cuerpo de método vacío; este es el equivalente async de un cuerpo de método vacío.

2

Depende únicamente de cómo decidas que el framework debe manejar estos casos.

que tiene, imo, varias opciones:

  • lanzar una excepción (se romperá Inmediatamente ejecución, y hay que mango de alguna manera en algún lugar en la cadena de ejecución).

  • retorno default-value (que puede ser una solución ofrecida por usted:. Simplemente una tarea vacío que no hace nada malo de esto es que llamo a la función esperando que hace algo, no un mensaje si hay otra cosa que no hacer nada tampoco. Imo, esto es un mal diseño.

  • retorno algunos not-valid-value, que fue cortado por la persona que llama por lo que llama "sabe" que algo no es buena.

0

Me encontré con esto con una clase base abstracta. Probé el método de Stephen Cleary, pero estaba recibiendo errores de compilación en C# 6.

Un ejemplo de mi método de base:

protected abstract Task OnFoo(Bar bar); 

Esto es lo que tenía que hacer en mi clase derivada:

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

El problema con la otra respuesta fue la palabra clave return en la frase. Debido a que el valor de retorno de Task es esencialmente void, no puede devolver nada. Además, se requiere la palabra clave await.

Cuestiones relacionadas