c# - Contratos de código+Async en.NET 4.5: "El método u operación no está implementado"
.net-4.5 code-contracts (4)
Recibo el siguiente error de compilación de ccrewrite cuando uso Contratos de código 1.4.51019.0 en VS2012 en Windows 7 x64: "El método u operación no está implementado".
Parece ser causada por una combinación de acceso de propiedad y el uso de métodos async
que carecen de una await
interna.
Pasos de reproducción:
Cree una nueva biblioteca de clases con la comprobación de contratos de tiempo de ejecución ''completa'' habilitada:
namespace CodeContractsAsyncBug
{
using System.Threading.Tasks;
public class Service
{
// Offending method!
public async Task ProcessAsync(Entity entity)
{
var flag = entity.Flag;
}
}
public class Entity
{
public bool Flag { get; set; }
}
}
Alguien más ha experimentado esto?
Creo que la palabra clave asincrónica solo significa eso, ya sea que tengas que esperar durante el código, mediante el cual se generará una Tarea y se manejará cuando se llame al método, o deberás devolver una Tarea explícitamente.
Un método async
que no await
es usualmente indicativo de un error de programación. Hay una advertencia del compilador que le informará de esta situación.
Si desea implementar de forma sincrónica un método con una firma asincrónica, la forma normal de hacerlo es implementar un método que no sea async
y devolver una Task
, como Task.FromResult<object>(null)
. Tenga en cuenta que con este enfoque, las excepciones se generan de forma síncrona en lugar de colocarse en la Task
devuelta.
En los últimos meses, hemos solucionado muchos problemas con la reescritura de métodos asíncronos. Le sugiero que pruebe su código nuevamente en el último instalador y, si todavía tiene problemas, proporcione una reprografía completa.
Esto parece estar arreglado en la versión 1.5 de los Contratos de Código.